Discuss / Java / 求解答

求解答

Topic source

Faded-零

#1 Created at ... [Delete] [Delete and Lock User]

我想问下这段代码打印结果好像没有同步,但找不出问题来

public class Main {
    public static void main(String[] args) {
        Counter t1 = new Counter();        
        Counter t2 = new Counter();        
        new Thread(() -> t1.add(100)).start();       
        new Thread(() -> t1.dec(100)).start();        
        
        new Thread(() -> t2.add(100)).start();        
        new Thread(() -> t2.dec(100)).start();        
        System.out.println("t1.count = " + t1.get());        
        System.out.println("t2.count = " + t2.get());   
    }
}
class Counter{
    private int count = 0;    
    public synchronized void add(int n){
        count += n;    
    }
    public synchronized void dec(int n){
        count -= n;    
    }
    public int get(){
        return count;    
    }
}

Faded-零

#2 Created at ... [Delete] [Delete and Lock User]

结果有时是0 和100,有时是0 和0

M-LaiBin

#3 Created at ... [Delete] [Delete and Lock User]

你开启了四个线程,但是并没有保证线程的执行顺序,所以最后输出的状态不一定

廖雪峰

#4 Created at ... [Delete] [Delete and Lock User]

同步只保证多线程执行的synchronized块是依次执行,最终状态对不对还取决于你的逻辑。

更何况你在线程的执行过程中去读状态,那就不一定读到啥了,因为你没法判断读取的时候其他线程的状态。

Faded-零

#5 Created at ... [Delete] [Delete and Lock User]

懂了,感谢

浪过扬帆

#6 Created at ... [Delete] [Delete and Lock User]

你想拿到0这个答案很简单,你使用join()方法等待这4个线程都完成之后再get()就可以了

Bylgja_

#7 Created at ... [Delete] [Delete and Lock User]

你吧add方法名改一下试试.....

四季43437

#8 Created at ... [Delete] [Delete and Lock User]

我为什么结果都是0  0   ,求大佬解答

四季43437

#9 Created at ... [Delete] [Delete and Lock User]

好像懂了,主线程和其他4个线程进行抢占是不?如果其他线程没执行完就执行主线程的get,那么结果就不一样。但是我为什么都是 0 0 呢?求解答。

CSU孔文佳

#10 Created at ... [Delete] [Delete and Lock User]

跟楼上一样的疑问,我每次运行的结果怎么都是 0 呢,求解答


Reply