最近在看关于线程方面的书,里边涉及到 volatile 修饰符。小弟有一点困惑,忘大家不吝赐教。
在<<java并发编程实践>> 这本书里边,有一小结谈论到该修饰符。里边指出该修饰符可以确保线程的可见性,但是不能确保操作的原子性。
也就是说在非原子性操作该变量的时候,还是会出现问题。书里说的是 "最低安全性" (类似数据库 read_uncommited) 。
写道
private volatile int i ;
void set(int i) this.i = i
int get() return i
void set(int i) this.i = i
int get() return i
以上是线程安全的,因为操作时原子的
写道
private volatile int i
void synchroized set(int i ) i++
int get() return i ;
void synchroized set(int i ) i++
int get() return i ;
我想问的问题是 既然i 已经满足线程的可见性,那通过同步的set方法,get方法在不使用同步的情况在不同步的情况先是否可以获得最新的值(i++ 是非原子操作)