gpt4 book ai didi

java - 这样的同步不会阻止并发

转载 作者:行者123 更新时间:2023-12-01 19:53:15 33 4
gpt4 key购买 nike

我在java多线程方面非常新手,所以如果有人给我简要解释以下内容,我将非常感激:

这是我的代码:

public class Lesson6 {
private static volatile Long value = 0L;

public static void main(String[] args) throws InterruptedException {
Thread inc = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100_000; i++) {
synchronized (this){
++value;
}
}
}
});
inc.start();

Thread dec = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100_000; i++) {
synchronized (this){
--value;
}
}
}
});
dec.start();

inc.join();
dec.join();

System.out.println(value);
}
}

在我看来,输出应该为零,但它永远不会为零。调试器显示,随着 run() 方法的执行,THIS 总是不时地变化。为什么会出现这种情况?

谢谢。

最佳答案

Debugger shows that THIS is always different from time to time as run() methods go

每个new Runnable都是一个不同的对象,因此this在每种情况下都是不同的。

如果您使用公共(public)对象,程序应该可以运行。

顺便说一句,我建议使用原始的 long 作为值,而不是对 Long 的引用

public class Lesson6 {
private static volatile long value = 0L;

public static void main(String[] args) throws InterruptedException {
final Object locked = new Object();
Thread inc = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100_000; i++) {
synchronized (locked){
++value;
}
}
}
});
inc.start();

Thread dec = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100_000; i++) {
synchronized (locked){
--value;
}
}
}
});
dec.start();

inc.join();
dec.join();

System.out.println(value);
}
}

打印

0

关于java - 这样的同步不会阻止并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50542245/

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