我最近经历了 volatile 关键字的这种奇怪行为。据我所知,
volatile关键字应用于变量,以反映一个线程对变量数据所做的更改到另一个线程。
volatile 关键字防止在线程上缓存数据。
我做了一个小测试…………
我使用了一个名为 count 的整数变量,并在其上使用了 volatile 关键字。
然后制作了 2 个不同的线程将变量值增加到 10000,因此最终结果应该是 20000。
但情况并非总是如此,使用 volatile 关键字,我不会始终获得 20000,而是 18534、15000 等......有时是 20000。
但是当我使用同步关键字时,它工作得很好,为什么......??
谁能解释一下 volatile 关键字的这种行为。
我使用 volatile 关键字和带有 synchronzied 关键字的代码发布我的代码。
下面的代码与变量计数上的 volatile 关键字的行为不一致
public class SynVsVol implements Runnable{
volatile int count = 0;
public void go(){
for (int i=0 ; i<10000 ; i++){
count = count + 1;
}
}
@Override
public void run() {
go();
}
public static void main(String[] args){
SynVsVol s = new SynVsVol();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Total Count Value: "+s.count);
}
}
以下代码与 go() 方法中的 synchronized 关键字完美结合。
public class SynVsVol implements Runnable{
int count = 0;
public synchronized void go(){
for (int i=0 ; i<10000 ; i++){
count = count + 1;
}
}
@Override
public void run() {
go();
}
public static void main(String[] args){
SynVsVol s = new SynVsVol();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Total Count Value: "+s.count);
}
}