gpt4 book ai didi

java - 同步方法不能作为锁工作?为什么不在计数上加锁

转载 作者:行者123 更新时间:2023-11-30 06:03:23 25 4
gpt4 key购买 nike

正如下面给出的代码,我可以使用我的 count 的密集锁(监视器)变量且只有一个 Thread可以通过创建 synchIncrement() 一次访问方法成为同步方法。那么O/P应该是20000但仍有一些时差值即将到来。

为什么?

public class SynchBlockThread {
private int count = 0;

private synchronized void synchIncrement() {
count++;
}

public static void main(String[] args) {
SynchBlockThread sBT = new SynchBlockThread();
sBT.doWork();

}

private void doWork() {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0; i<10000; i++) {
synchIncrement();
}
}
});

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0; i<10000; i++) {
synchIncrement();
}
}
});

t1.start();
t2.start();

try {
t1.join();
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(count);
}
}

enter image description here

最佳答案

很难发现。

doWork() 方法的末尾,您加入了 Thread t1 两次,因此当结果出现时 Thread t2 仍在执行其工作已打印。

用代码表达:

try {
t1.join();
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

应该是

try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

关于java - 同步方法不能作为锁工作?为什么不在计数上加锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52155489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com