gpt4 book ai didi

java - 线程不安全的递减/递增 - 为什么大多数是积极的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:14:54 25 4
gpt4 key购买 nike

我想知道 java 线程中不安全递减/递增的结果,所以有我的程序:

主类:

public class Start {

public static void main(String[] args) {

int count = 10000000, pos = 0, neg = 0, zero = 0;

for (int x=0; x<10000; x++) {

Magic.counter = 0;

Thread dec = new Thread(new Magic(false, count));
Thread inc = new Thread(new Magic(true, count));

dec.start();
inc.start();

try {
inc.join();
dec.join();
} catch (InterruptedException e) {
System.out.println("Error");
}

if (Magic.counter == 0)
zero++;
else if (Magic.counter > 0)
pos++;
else
neg++;
}

System.out.println(Integer.toString(neg) + "\t\t\t" + Integer.toString(pos) + "\t\t\t" + Integer.toString(zero));
}
}

线程类:

public class Magic implements Runnable {

public static int counter = 0;

private boolean inc;
private int countTo;

public Magic(boolean inc, int countTo) {
this.inc = inc;
this.countTo = countTo;
}

@Override
public void run() {

for (int i=0;i<this.countTo;i++) {

if (this.inc)
Magic.counter++;
else
Magic.counter--;
}

}
}

我已经运行了几次程序,并且总是得到比负面结果多得多的正面结果。我还尝试更改线程启动的顺序,但这没有任何改变。一些结果:

Number of results < 0 | Number of results > 0 | Number of results = 0

1103 8893 4
3159 6838 3
2639 7359 2
3240 6755 5
3264 6728 8
2883 7112 5
2973 7021 6
3123 6873 4
2882 7113 5
3098 6896 6

最佳答案

我敢打赌,您会看到与以下更改完全相反的行为(即,在不更改任何其他内容的情况下反转分支):

if (this.inc)
Magic.counter--; // note change, and lie about `this.inc`
else
Magic.counter++;

如果为真,这表明线程交互有什么意义?

现在,为了好玩,让 Magic.counter 可变——结果如何变化?

如何删除 volatile 并用 lock 包围 if/else? ( 确保完整的内存栅栏并建立临界区。它应该总是产生完美的结果。)

快乐编码。


需要考虑的事项:

  1. 代码只查看小于或大于零的值,而不是整体漂移/变化:+1 或 -1 足以让天平倾斜。 (扩大收集的数据可能更有用。)
  2. 执行“else”分支需要的时间稍长,因为需要跳转;通常这不是问题,但超过 1000 万次循环……一两次并不多。
  3. 缺少 volatile/memory-fence 为 Magic.counter 变量的可见性留出了很多余地。 (我相信符合标准的 JVM 实际上会产生更糟糕的结果......)
  4. ++-- 运算符本质上是非原子的。
  5. 线程交错通常是“非确定性的”;如果跨多个内核执行,则更少。

关于java - 线程不安全的递减/递增 - 为什么大多数是积极的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7842560/

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