복합 작업 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
스매시하지 마십시오 ). 레이스 테스트에는 더 단단한 내부 루프가 필요합니다. 마지막에 요약을 인쇄하십시오 (아래에서 누군가가 단위 테스트 프레임 워크로 수행 한 것처럼).