이 코드를 살펴 보겠습니다.
java.util.bitset; import java.util.current.countdownlatch; 스레드 t1 = new Thread (new Runnable () {public void run () {try {latch.await (); thread.sleep (1000);} catch (예외) {} bs.set (1);}); 스레드 t2 = 새 스레드 (new Runnable () {public void run () {try {latch.await (); thread.sleep (1000);} catch (예외 e) {} bs. 세트 (2);}}) ; start (); latch.countdown (); :}}문제는이 코드 출력의 결과는 무엇입니까? 붕괴 된 JVM에서도 어떤 결과를 출력 할 수 있습니까?
이 프로그램이 무엇을하는지 살펴 보겠습니다.
다음으로 이러한 동작을 확인하기 위해 일부 테스트 사례를 구성해야합니다. 분명히 그들 중 하나는이 예제 만 실행 한 다음 결과를 관찰하고 위의 질문에 대답 할 수 있지만, 허용 가능한 출력에 대한 두 번째 결과에 답하십시오.
주의는 우연의 일치를 만들 수 있습니다
다행히도 도구를 사용할 수 있습니다. JCStress는 이러한 문제를 해결하기위한 테스트 도구입니다.
우리는 JCStress가 인식 할 수있는 형태로 테스트 케이스를 쉽게 쓸 수 있습니다. 실제로, 그것은 우리를 위해 다양한 인터페이스를 준비했습니다. 예제가 필요합니다.이 예에서는 두 스레드가 함께 실행됩니다.
ACTOR2_ARBITER1_TEEST <BITSET, BOOLEANRESULT2> 인터페이스를 사용합니다. 우리는 그것을 실행하려면 Java 8 JVM을 찾아야하지만 이제는 문제가되지 않습니다.
아래 구현을보십시오.
공개 클래스 anexexest는 actor2_arbiter1_test <bitset, booleanresult2> {@override public void actor1 (bitset s, booleanresult2 r) {s.set (1);} @override public void actor2 (bitset s, booleanresult2 r) {2 세트 (2) {2. );} @override public void abiter1 (bitset s, booleanresult2 r) {r.r1 = s.get (1); ;} @override public boolenrsult2 newresult () {return new booleanresult2 ();}}
이제이 테스트를 실행할 때 Control은 모든 종류의 트릭을 시도하여 이러한 동작을 주도하는 모든 요소 조합을 얻을 수 있습니다. 병렬 또는 비 말기, 부하 감지가 없으며 한 줄에 여러 번 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번, 여러 번 있습니다. 여러 번, 여러 번, 여러 번 가능한 모든 결과가 기록됩니다.
병렬 코드가 어떻게 켜져 있는지 알고 싶을 때, 이것은 중공 생각을 파고 자신보다 모든 세부 사항을 생각하는 더 좋은 방법입니다.
또한 JCStress 제약으로 인한 종합 편의를 위해서는 가능한 결과에 대한 설명을 제공해야합니다.
<test name = "org.openjdk.jcstress.tests.custom.anexampletest"> <contributed-by> eleg shelajev </contributed-by> <bitset이 동기화 된 경우 잘 작동합니다 > [true, true] </match> <eggitt> 허용 가능한 </exply> <description> 모든 업데이트가 손상되지 않습니다 /<description> t2는 t1 결과를 덮어 씁니다. </description> </case> <match> </match> <eccistable_interesting > </case> <matched> <eggt> forbidden </exten> <description> 다른 모든 사례는 </description on> </unsully> </test>입니다
이제 우리는이 짐승이 다음 명령 줄을 사용하여 테스트를 시작할 준비가되었습니다.
java -xx :+unlockdiagnosticvmoptions -xx :+whiteboxapi -xx : -resterictContrended -jar tests -Custot/Target/JCStress.jar -t = ".
우리가 얻는 결과는 우아한 보고서입니다.
우리는 예상 결과를 얻을 수있을뿐만 아니라, 두 스레드 모두 위치를 설정했을뿐만 아니라 경쟁력있는 조건을 만나고, 한 스레드는 다른 스레드의 결과를 다룰 것입니다.
그런 것을 보더라도 "산민들이 자신의 속임수를 가지고있다"라는 평온한 정신을 가져야합니까?
그건 그렇고,이 코드를 수정하는 방법에 대해 생각하고 있다면, 대답은 Javadoc에서 Bitset 클래스를 신중하게 읽고 스레드 보안이 아니며 외부 동기화가 필요하다는 것을 인식하는 것입니다. 동기 블록의 설정 값을 높이면 쉽게 달성 할 수 있습니다.
동기화 (bs) {bs.set (1);}