我是线程和学习的新手。为什么这个数据竞争?我知道如何使用Synchronized(){}
方法,而不是使用修饰符。
public class SyncMethodDataRace extends Thread {
private static int common = 0;
public synchronized void run(){
int local = common;
local++;
common = local;
}
public static void main(String[] args) throws InterruptedException {
SyncMethodDataRace[] allThreads = new SyncMethodDataRace[20000];
for(int i = 0; i < allThreads.length; i++){
allThreads[i] = new SyncMethodDataRace();
}
for(SyncMethodDataRace d: allThreads){
d.start();
}
for(SyncMethodDataRace d: allThreads){
d.join();
}
System.out.println(common);
}
}
答案 0 :(得分:3)
通过制作run
方法synchronized
,您无法实现所需的同步。 synchronized方法锁定类的当前实例。在您的示例中,没有其他线程正在调用另一个线程的run
方法,因此没有阻塞。
在您的情况下,您可能需要一个在所有实例之间共享的静态对象,即:
private static Object syncObject = new Object();
public void run() {
synchronized (syncObject) {
//....
}
}