我似乎无法获得 20000 的最终计数器值。这段代码有什么问题?
public class Synchronize2 {
public static void main(String[] args) {
Threading t1 = new Threading();
Threading t2 = new Threading();
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Threading.counter);
}
}
class Threading extends Thread {
static int counter;
public synchronized void incrementer() {
counter++;
}
public void run() {
for (int i=0; i<10000; i++) {
incrementer();
}
}
}
最佳答案
您的同步 incrementer
方法将锁定对象本身。但是您有 2 个不同的对象,每个对象都锁定自己,因此该方法不是线程安全的;两个线程仍然可以同时访问 incrementer
。
此外,后增量操作不是线程安全的,因为它不是原子的;有读操作和自增操作,两个操作中间可以中断一个线程。此非线程安全代码呈现竞争条件,其中线程一读取值,线程二读取值,然后线程一递增和线程二递增,但只有最后一个递增“获胜”并且一个递增丢失。当结束值小于 20000 时显示。
也使方法静态
,因为它是同步的
,所以它会锁定类的类对象,这里是适当的同步。
public static synchronized void incrementer() {
关于java - 方法同步线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21049861/