我知道像 i++
这样的复合操作不是线程安全的,因为它们涉及到 多个操作。
但是检查引用本身是一个线程安全的操作吗?
a != a //is this thread-safe
我尝试编写这个程序并使用多个线程,但它没有失败。我猜我不能在我的机器上模拟比赛。
public class TestThreadSafety {
private Object a = new Object();
public static void main(String[] args) {
final TestThreadSafety instance = new TestThreadSafety();
Thread testingReferenceThread = new Thread(new Runnable() {
@Override
public void run() {
long countOfIterations = 0L;
while(true){
boolean flag = instance.a != instance.a;
if(flag)
System.out.println(countOfIterations + ":" + flag);
countOfIterations++;
}
}
});
Thread updatingReferenceThread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
instance.a = new Object();
}
}
});
testingReferenceThread.start();
updatingReferenceThread.start();
}
}
这是我用来测试线程安全性的程序。
当我的程序在一些迭代之间启动时,我会得到输出标志值,这意味着在同一个引用上引用 !=
检查失败。但是在一些迭代之后,输出变为常量值 false
,然后长时间执行程序不会产生单个 true
输出。
正如输出所显示的,在一些 n (非固定的)迭代之后,输出似乎是常数值,并且不会改变。
产出:
对于一些迭代:
1494:true
1495:true
1496:true
19970:true
19972:true
19974:true
//after this there is not a single instance when the condition becomes true