我已经执行了下面的代码,期望计数为20000.我已经将count声明为volatile,但输出并不是一直都是正确的。
package threading;
public class Demo5 {
private volatile int count =0;
public static void main(String[] args){
Demo5 d = new Demo5();
d.doWork();
}
public void doWork(){
Thread t1 = new Thread(new Runnable() {
public void run() {
for(int i=0; i<10000; i++){
count++;
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
for(int i=0; i<10000; i++){
count++;
}
}
});
t1.start();
t2.start();
try{
t1.join();
t2.join();
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(count+" is count");
}
}
后来我尝试将count作为同步方法,将其置于同步方法中,并且它正常工作。
public synchronized void increment(){
count++;
}
有人可以告诉我什么时候应该选择volatile以及何时进行同步?
答案 0 :(得分:1)
使用volatile
,您可以在同一个关键部分中包含增量和设置操作。使用volatile
,增量和集合将分别受到保护。这意味着一个线程可以递增,然后另一个线程可以递增,然后一个线程可以设置后跟另一个线程,不一定按照它们递增的相同顺序。 synchronized
只能协调单个操作; {{1}}可以协调行动序列。