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 可能只是“防止损坏”,因为它使系统有时间完成所有线程的启动。

除此之外,您还可以正确使用“同步”。多个线程可以在任何地方写入您需要的同一个变量,通常(简化),如果您只是在阅读,则不需要它。

09-10 11:03
查看更多