我想验证以下我写的验证事实,即两个线程可以同时访问静态同步方法和非静态同步方法(因为锁在不同的对象上)。我得到了一个结果,但想知道我的解释是否正确实例和静态方法的并发测试的有效性
我跑了下面的代码,我看到变量我分别在静态和非静态方法打印时相同的值。这是对静态和非静态方法锁定两个不同对象并且两个线程可以同时访问它们这一事实的有效证明。
代码
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