
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
昆明达内培训的小编知道,volatile描述中有这样一个比喻的说法,如下代码所示,对a的读写相当于对b的同步读写。
public volatile int a = 0;
private int b = 0;
public synchronized int getB(){
return b;
}
public synchronized void setB(int b){
this.b = b;
}
也就是说,volatile只保证了读与写的同步,每次读取都是得到最新值,每次写入都是覆盖最新值。
这就暗示着,非volatile变量的读写并非最新值,因为每个线程都有自己独立的内存保存着变量的副本,并非第一时间读取公共内存的变量。
现在,道理是明白的,接下来主要看它使用的场合和条件。
写入值不能依赖于读取值,例如a++,其实是一个“先读取,再运算,后写入”的步骤,存在了写入值依赖于读取值。
如果它除了读与写需要同步外,还需要其它同步的操作,那么其它同步的操作,无疑肯定要借助于synchronized。如果它的读与写的频率远远高于其它同步的操作,这时候就可以考滤volatile与synchronized的并用。