package threadShareResource1;
public class NonSynchro1 {
private int sum = 0;
public static void main(String[] args) {
NonSynchro1 n = new NonSynchro1();
n.task();
System.out.println(n.getSum());
}
public synchronized void sumAddOne(){
sum++;
}
public void task(){
for (int i = 0; i < 100; i++) {
new Thread(new Runnable(){
@Override
public void run() {
sumAddOne();
}
}).start();
/* try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
} */
}
}
public int getSum() {
return sum;
}
}
如果没有代码的注释部分,该程序将出现数据损坏,每次运行该错误的次数都不是100。但是我认为synced关键字应该获得对sumAddOne方法的锁定,而sumAddOne方法是程序的关键区域,允许一个线程每次访问此方法。
我也尝试过使用ExecutorService,但是它并不能提供100次全部运行。
public void task(){
ExecutorService s = Executors.newCachedThreadPool();
for (int i = 0; i < 100; i++) {
s.execute(new Thread(new Runnable(){
@Override
public void run() {
sumAddOne();
}
}));
}
s.shutdown();
while(!s.isTerminated()){}
}
最佳答案
在Task()中,您启动100个线程(很多),每个线程加1求和。
但是当Task完成时,您只知道100个线程正在启动中。您在调用println()之前不会阻塞,那么您如何知道所有线程都已完成?
sleep 可能只是“防止损坏”,因为它使系统有时间完成所有线程的启动。
除此之外,您还可以正确使用“同步”。多个线程可以在任何地方写入您需要的同一个变量,通常(简化),如果您只是在阅读,则不需要它。