同步的多线程添加1到数字,结果变化



我不知道这是否正确,但是我试图使用1000个线程将1添加到变量中。然后,我在末尾打印出数字以验证其有效,它从来没有1000,也会更改。

我确定这可能是从谷歌搜索和查看的同步问题,但是当我尝试同步线程时,它最终仍不是1000,但差异很小,但差异很小(在995至997之间变化,而没有同步的情况。它大约在900至1000之间(。

这是我到目前为止所做的:

public class Main extends Thread{
    public static void main(String[] args) {
        Thread[] threads = new Thread[1000];
        Adder adder = new Adder();
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread(new ThreadAddSync(adder));
            threads[i].start();
        }
        System.out.println("----- " + adder.count);
    }
}
public class ThreadAddSync implements Runnable{
    Adder add;
    public ThreadAddSync(Adder add){
        this.add = add;
    }
    @Override
    public void run() {
        synchronized(add){
            add.add();
        }
    }
}
public class Adder {
    int count = 0;
    public void add(){
        count += 1;
    }
}

我的问题是,这些线程是否应该像我写这本书一样同步?如果他们同步,为什么在技术上安全的结果会产生不同的结果?

System.out.println("----- " + adder.count);-访问 count,但不要在 addersynchronize,因此,它是不是安全的(您也不等待工人完成, join(),如果您希望在打印总数之前看到最终总数,或者添加另一个循环等待(。另外,在实际代码中,您应该使用AtomicInteger

最新更新