我知道诸如之类的复合操作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
1234:true
永不粉碎的行)。竞赛测试需要更紧密的内循环。最后打印摘要(就像下面有人对单元测试框架所做的那样)。