我想驗證以下我寫的驗證事實,即兩個線程可以同時訪問靜態同步方法和非靜態同步方法(因爲鎖在不同的對象上)。我得到了一個結果,但想知道我的解釋是否正確實例和靜態方法的併發測試的有效性
我跑了下面的代碼,我看到變量我分別在靜態和非靜態方法打印時相同的值。這是對靜態和非靜態方法鎖定兩個不同對象並且兩個線程可以同時訪問它們這一事實的有效證明。
代碼
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 2010-12-15 16:02:21
夠公平的。如果你只是試圖證明這種行爲,那麼沒關係。 :-) – chubbsondubs 2010-12-15 19:04:32