1. 并发:
a) 并发一定是涉及到了多个执行流
b) 多个执行流之间一定有数据的共享(如果全是私有的数据就不会相互影响了(因为硬件上底层先保证了硬件资源的并发透明性,然后又没有共享的数据,相当于各个执行流在单独的封闭的上下文中独自的运行了))
c)
i. 并行的执行流之间到底会有什么样的联系呢,或者说他们是怎么耦合在一起的?除了在硬件上可能同时征用共享的资源之外(这个由底层的硬件保证了不会造成影响),就是共享同一份数据的时候的竞争关系和等待其他县城或者通知其他线程的合作关系。而且,合作关系在底层的硬件上是通过,某些状态的共享来实现的消息的传递。而竞争关系的实现也是通过共享的状态来实现的。在本质上,竞争和合作关系都是多个执行流之间进行通信的一种表现形式,或者说是进行同步的表现形式。多个执行流共享状态进行同步是底层,而协作的实现和数据的排他共享式上层的对共享状态的一种应用。
ii. 共享状态这样一种通信或者说同步方式必须得到硬件的原子性的test-set这种原子指令的支持或者有全局封锁总线那种全局枷锁的支持才能够实现
iii. 在进一步的抽象,共享状态通信只是多个执行流进行通信的一种方式。共享状态的通信方式或者说同步方式在单个机器上或者说单个共享主存的单位上是能够使用的,但是多个机器之间的执行流之间是如何获得同步的呢?因为多个执行流之间已经不能够进行数据的共享了,因此首先要通过通信手段(专门指传送信息的通信)传送预先约定好编码的状态,并且多个执行流起始于一个特定的状态,然后根据传递的编码和设计好的多进程同步的协议来获得大范围的,不同机器上的多个执行流的同步。
iv. 因此,不论在一个机器上,还是在不同的机器上,多个执行流都能够获得同步(状态共享或者是通信+协议+编码状态)。这里的同步是指对系统处于某个子状态达成共识。基于已经获得的同步,能够实现执行流之间的协作和竞争。
d) 因此,同步是系统状态的某种共识。基于同步多个执行流能够展开协作和竞争。同步的实现在同一个机器上和不同的机器上的实现是不同的。可以认为同一个机器上的状态共享是多个机器上实现方式的一种退化形式。
e) 协作是一种同步,是对某一状态是否为真或假或者某一个数据是否为特定值的共同认识,排他共享数据也是这样。为了防止出现错误,发起者需要底层提供读取并判断和设置的原子操作,接受者需要底层提供判断并跳转这样的原子操作或类似的实现相同意图的手段(总线索,进程间同步)。
f) Java如何实现多个执行流的同步?就范畴而言,这个同步是上面讨论的进程内的同步。Java规定了多个线程间使用的存储模型是私有的缓存加上共享的主存。并且java规定了一先行发生的关系happens-before order(包括几种,其中有枷锁和开锁的关系,线程启动的关系,语句先后的关系)。如果程序中的某些语句要实现按照特定的顺序执行,那么必须通过预定义的happends-before操作来实现相关操作的排序,如通过加锁。加锁就是上面e中提到的原子性的同步。Java进程内同步的其他应用也同样包括排他共享数据和协作(java中的happens-before order包含了协作语义)
同步的本质 java内存模型 happen before order
原文地址:http://blog.csdn.net/ndcnb/article/details/38780379