美文网首页
《深入理解Java虚拟机》(三)--Java内存模型与线程(2)

《深入理解Java虚拟机》(三)--Java内存模型与线程(2)

作者: 蓝色_fea0 | 来源:发表于2018-06-01 15:42 被阅读23次

1/4 对于long和double变量的特殊规则

Java内存模型于要求lock、unlock、read....等8个操作都具有原子性,但是对于64位的数据类型(long和double),在模型中定义了一条相对宽松的规定:允许虚拟机将没有被volatile修饰的64位变量划分成两次32位操作来进行,即允许虚拟机可以不保证64位数据类型的load、store、read、write这四个操作的原子性,这就是long和double的非原子协议,但是目前各种平台下都将64位的数据的读写操作作为原子操作来对待,所以这个规则其实并没有什么卵用...

1/5 原子性、可见性和有序性

Java的内存模型其实就是围绕着在并发过程中如何处理原子性、可见性和有序性这三个特征来建立的,我们来看一下哪些操作实现了这三个特性。

  • 原子性(Atomicity):我们通常可以认为基本数据类型的访问和读写是具备原子性的。如果应用场景需要一个更大范围的原子性操作,Java内存模型中还提供了lock和unlock操作,Java虚拟机并没有把lock和unlock直接提供给用户使用,但是却提供了更高层次的字节码指令monitorenter和monitorexit来使用这两个操作,这两个字节码指令反应到Java代码中就是synchronize关键字。
  • 可见性(Vsibility):可见性就是当一个线程修改了一个变量的值,其他线程能够立即得知。volatile关键字就实现了这个可见性,除了它之外,synchronize和final关键字也实现了可见性,synchronize很好理解,而final的可见性是指:被final修饰的字段在构造器中一旦初始化完成,那在其他线程中就能看见final字段的值。
  • 有序性(Ordering):之前提到的指令重排序会打乱有序性,Java中提供了volatile和synchronize来保证代码的有序性,volatile是靠禁止指令重排序,而synchronize则是因为“一个变量在同一时刻只允许一条线程对其进行lock操作”这个规则来实现的,这个规则决定了持有同一个锁的两个同步快只能串行进行。

1/6 先行发生原则

Java内存模型中,如果所有的有序性都靠volatile和synchronize来维护那么就会变得很繁琐,所以Java语言中有一个“先行发生原则”,它是判断数据之间是否存在竞争、线程是否安全的主要根据,同过这个原则可以解决判断并发环境下两个操作是否安全的问题。先行发生原则就是如果操作A先行发生于操作B,那么操作A对数据的所有影响就能同步到操作B,也就能保证线程安全。
下面是一些“天然的”先行发生关系。如果两个操作之间的关系不在下面这些规则里面,那么它就不能保证程序的顺序性。

  • 程序次级规则(Program Order Rule):在同一个线程内,按照程序代码的顺序,前面的操作先行发生于后面的操作。
  • 管程锁定规则(Monitor Lock Rule):对于两个synchronize来说,前一个同步代码块的unlock操作先行发生于后一个同步代码块的lock操作。
  • volatile变量规则(Volatile Varialble Rule):对一个volatile修饰的变量的写操作,先行发生于后面对这个变量的读操作。
  • 线程启动规则(Thread Start Rule):*Thread对象的start()方法先行发生于此线程的每一个动作。
  • 线程终止规则(Thread Termination Rule):线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值等手段检测到线程已经终止执行。
  • 线程中断规则(Thread Interruption Rule):对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事情的发生,可以通过Thread.interrupted()方法检测到是否有中断发生。
  • 对象终结规则(Finalizer Rule):一个对象的初始化完成(构造方法执行结束)先行发生于它的finalize()方法的开始。
  • 传递性(Transitivity):如果操作A先行发生于操作B,操作B先行发生于操作C,那么操作A先行发生于操作C;

相关文章

网友评论

      本文标题:《深入理解Java虚拟机》(三)--Java内存模型与线程(2)

      本文链接:https://www.haomeiwen.com/subject/agghsftx.html