Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
Synchronize修饰的变量或者方法在每次被线程访问时,都会先锁定此资源,然后操作,操作完成后解锁。与Volatile最大的不同在于锁定和解锁,保证了操作的原子性,而Volatile只能保证read-write等原子操作的原子性,当三者混合执行时就会出错,如:
Synchronize修饰的变量或者方法在每次被线程访问时,都会先锁定此资源,然后操作,操作完成后解锁。与Volatile最大的不同在于锁定和解锁,保证了操作的原子性,而Volatile只能保证read-write等原子操作的原子性,当三者混合执行时就会出错,如:
- public class TestRaceCondition {
- private volatile int i = 0;
- public void increase() {
- i++;
- }
- public int getValue() {
- return i;
- }
- }
没有评论:
发表评论