这样肯定是不行的。如下例:
public class Test {
public static void main(String[] a) {
new Thread(new Runnable() {
@Override
public void run() {
R.a();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
new R().b();
}
}).start();
}
}
class R {
static synchronized void a() {
System.out.println("f1 1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("f1 2");
}
synchronized void b() {
System.out.println("f2 1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("f2 2");
}
}
输出结果是:
f1 1
f2 1
f1 2
f2 2
在非静态方法上加同步锁,锁定的是this,即创建的对象。
在静态方法上加同步锁,锁定的是类的字节码。 |