我写了下面提到的代码,我期望12000作为答案。但是没有得到正确的答案。每次运行我都会得到一个新的数字
程序包线程;
public class ThreadExp extends Thread {
static volatile int count=0;
public synchronized void increment() {
count++;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadExp a = new ThreadExp();
a.start();
ThreadExp a1 = new ThreadExp();
a1.start();
try {
a.join();
a1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(count);
}
public void run() {
for(int i=1; i<=6000 ;i++) {
increment();
}
}
}
答案 0 :(得分:4)
非静态同步方法在this
对象上同步(请参见JLS, §8.4.3.6)。因此,您使用的ThreadExp
的两个实例不是相互排斥的执行increment()
。
您可以通过将increment()
定义为static
来解决问题,因为静态方法会在代表类型的class
-Object上进行同步。
Elliott Frisch提到了另一种解决方案:使用AtomicInteger
代替volatile int
。