陷阱7:正确使用静态同步方法
Java语言规定:任何线程进入同步方法,同步代码块之前,必须先获取同步方法,同步代码块对应的同步监视器。对于同步代码块而言,程序必须显示为它指定同步监视器;对于同步非静态方法而言,该方法的同步监视器是this-即调用该方法的Java对象;对于静态的同步方法而言,该方法的同步监视器不是this,而是该类本身。
class SynchronizedStatic implements Runnable {
static boolean flag = true;
public static synchronized void test0() {//同步监视器是该类本身
for (int i = 0; i < 1000; i++) {
System.out.println("test0: " + Thread.currentThread().getName()
+ " " + i);
}
}
public void test1() {
synchronized (this) {//同步监视器是this,即调用该方法的Java对象。
for (int i = 0; i < 1000; i++) {
System.out.println("test1: " + Thread.currentThread().getName()
+ " " + i);
}
}
}
public void run() {
if (flag) {
flag = false;
test0();
} else {
flag = true;
test1();
}
}
public static void main(String args[]) throws InterruptedException {
SynchronizedSta