作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想知道 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
? (锁
确保完整的内存栅栏并建立临界区。它应该总是产生完美的结果。)
快乐编码。
需要考虑的事项:
Magic.counter
变量的可见性留出了很多余地。 (我相信符合标准的 JVM 实际上会产生更糟糕的结果......)++
和 --
运算符本质上是非原子的。关于java - 线程不安全的递减/递增 - 为什么大多数是积极的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7842560/
谁能解释当应用程序通过 802.11 WiFi 网络发送 UDP 单播数据报时它是如何工作的?假设非阻塞 UDP 套接字。具体而言,假设 802.11n 或 802.11ac 以及相当新的 Linux
我是一名优秀的程序员,十分优秀!