public class LockTest2 {
static byte[] staticObj =new byte[0];
byte[] obj =new byte[0];
/**
* 无锁
*/
public void t0(){
}
/**
* 无锁
*/
public static void t1(){
}
/**
* 对该类的所有实例加锁
*/
public static synchronized void t2(){
}
/**
* 对当前对象实例加锁
*/
public synchronized void t3(){
}
/**
* 在对象的非静态属性上加锁等同与t3()
* @param o
*/
public void t4(LockTest2 o){
synchronized(o.obj){
}
}
/**
* 在对象的静态属性(对象)上加锁等同于方法t2
* @param o
*/
public void t5(LockTest2 o){
synchronized(o.staticObj){
}
}
}
D:\workspace\eclipse2\listTest\bin>javap -c LockTest2
Compiled from "LockTest2.java"
public class LockTest2 extends java.lang.Object{
static byte[] staticObj;
byte[] obj;
static {};
Code:
0: iconst_0
1: newarray byte
3: putstatic #11; //Field staticObj:[B
6: return
public LockTest2();
Code:
0: aload_0
1: invokespecial #16; //Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_0
6: newarray byte
8: putfield #18; //Field obj:[B
11: return
public void t0();
Code:
0: return
public static void t1();
Code:
0: return
public static synchronized void t2();
Code:
0: return
public synchronized void t3();
Code:
0: return
public void t4(LockTest2);
Code:
0: aload_1
1: getfield #18; //Field obj:[B
4: dup
5: monitorenter
6: monitorexit
7: return
public void t5(LockTest2);
Code:
0: getstatic #11; //Field staticObj:[B
3: dup
4: monitorenter
5: monitorexit
6: return
}
当JVM执行一个方法时,执行中的线程识别该方法的method_info结构是否有ACC_SYNCHRONIZED标记设置,然后它自动获取对象的锁,调用方法,最后释放锁。如果有异常发生,线程自动释放锁。
而synchronized (obj)则是通过这2个指令monitorenter monitorexit
感觉synchronized (obj)更加灵活啊!