두 스레드가 정적 동기화 된 메서드와 비 정적 동기화 된 메서드에 동시에 액세스 할 수 있다는 사실을 확인하기 위해 작성한 아래 테스트의 유효성을 검사하고 싶습니다 (잠금이 다른 개체에 있으므로). 결과가 나오지만 제 해석이 맞는지 아닌지 알고 싶습니다.인스턴스 및 정적 메서드에 대한 동시성 테스트의 유효성
아래 코드를 실행하면 변수 i에 동일한 값이 정적 및 비 정적 방법으로 각각 인쇄되는 것을 보았습니다. 이것은 정적 및 비 정적 메서드가 두 개의 서로 다른 개체에 대한 잠금을 가지며 두 개의 스레드가 동시에 액세스 할 수 있다는 사실을 증명합니다.
코드
import java.util.ArrayList;
import java.util.List;
public class TestStaticSynchronize {
public static final TesteeClass obj = new TesteeClass();
/**
* @param args
*/
public static void main(String[] args) {
for(int i = 0; i < 50; i++) {
Runner run = new Runner(i);
Thread th = new Thread(run);
th.start();
}
}
static class Runner implements Runnable {
private int i;
public Runner(int i) {
this.i = i;
}
public void run() {
if(i % 2 == 0) {
TesteeClass.staticSync();
} else {
obj.instanceSync();
}
}
}
}
class TesteeClass {
private static List<Integer> testList = new ArrayList<Integer>();
public static synchronized void staticSync() {
System.out.println("Reached static synchronized method " + testList.size());
testList.add(1);
}
public synchronized void instanceSync() {
System.out.println("Reach instance synchronized method " + testList.size());
testList.add(1);
}
}
감사합니다. 이런 정적 멤버들과 놀 때의 의미를 이해합니다. 그러나 이것은 행동을 확인하는 가장 좋은 방법 인 것 같습니다. – Fazal
충분히 공정합니다. 만약 당신이 단지이 행동을 보여 주려고한다면 그것은 괜찮습니다. :-) – chubbsondubs