java同步机制实现方式volatile,详细解析

BSO 2020-11-04 15:39:07 java常见问答 9079

java中关于同步的问题和知识点是非常丰富的。今天就来为大家介绍一下java同步机制实现方式volatile并且详细解析,一起来了解一下吧。

首先我们需要知道的是,volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且当成员变量发生变化时,强迫线程将变化值回写到共享内存。

优势:这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

缘由:Java语言规范中指出,为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。

这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。而 volatile关键字就是提示VM :对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。

使用技巧:在两个或者更多的线程访问的成员变量上使用volatile 。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。

线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步,因此存在A和B不一致的情况。volatile就是用来避免这种情况的。

volatile告诉jvm,它所修饰的变量不保留拷贝,直接访问主内存中的(读操作多时使用较好;线程间需要通信,本条做不到)

Volatile变量具有synchronized的可见性特性,但是不具备原子特性。这就是说线程能够自动发现volatile变量的最新值。Volatile变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。

只能在有限的一些情形下使用volatile变量替代锁。要使volatile变量提供理

想的线程安全,必须同时满足下面两个条件:

1.对变量的写操作不依赖于当前值;

2.该变量没有包含在具有其他变量的不变式中。

以上就是关于java同步机制实现方式volatile的详细解析了。如果你对java知识感兴趣,想要了解更多的java基础知识,敬请关注奇Q工具网。

推荐阅读:

java多线程什么时候必须同步?如何同步?

java多线程的同步与异步,详细解析

java多线程同步ThreadLocal类,实例分享