public class Father { static { System.out.println("Father init"); } public void doSomething(String threadName){ synchronized (this) { System.out.println(threadName + " hold the father lock, Class " + this.getClass() + ", Address " + this.toString() + ", ThreadInfo " + Thread.currentThread()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(threadName + " release the father lock, Class " + this.getClass() + ", Address " + this.toString() + ", ThreadInfo " + Thread.currentThread()); } } }
public class Son extends Father{ static { System.out.println("Son init"); } public void doSomthing(String threadName){ synchronized (this) { System.out.println(threadName + " hold the son lock, Class " + this.getClass() + ", Address " + this.toString() + ", ThreadInfo " + Thread.currentThread()); super.doSomething(threadName); System.out.println(threadName + " release the son lock, Class " + this.getClass() + ", Address " + this.toString() + ", ThreadInfo " + Thread.currentThread()); } } public static void main(String[] args) throws InterruptedException { Father father = new Father(); Son son = new Son(); Thread t1 = new Thread(){ public void run(){ son.doSomthing("t1"); } }; Thread t2 = new Thread(){ public void run(){ father.doSomething("t2"); } }; Thread t3 = new Thread(){ public void run(){ father.doSomething("t3"); } }; t2.start(); t3.start(); Thread.sleep(100); t1.start(); } }
输出:
Father init
Son init
t3 hold the father lock, Class class com.blackfish.bill.billlist.Father, Address com.blackfish.bill.billlist.Father@4178d239, ThreadInfo Thread[Thread-2,5,main]
t1 hold the son lock, Class class com.blackfish.bill.billlist.Son, Address com.blackfish.bill.billlist.Son@48e0ce1c, ThreadInfo Thread[Thread-0,5,main]
t1 hold the father lock, Class class com.blackfish.bill.billlist.Son, Address com.blackfish.bill.billlist.Son@48e0ce1c, ThreadInfo Thread[Thread-0,5,main]
t3 release the father lock, Class class com.blackfish.bill.billlist.Father, Address com.blackfish.bill.billlist.Father@4178d239, ThreadInfo Thread[Thread-2,5,main]
t2 hold the father lock, Class class com.blackfish.bill.billlist.Father, Address com.blackfish.bill.billlist.Father@4178d239, ThreadInfo Thread[Thread-1,5,main]
t1 release the father lock, Class class com.blackfish.bill.billlist.Son, Address com.blackfish.bill.billlist.Son@48e0ce1c, ThreadInfo Thread[Thread-0,5,main]
t1 release the son lock, Class class com.blackfish.bill.billlist.Son, Address com.blackfish.bill.billlist.Son@48e0ce1c, ThreadInfo Thread[Thread-0,5,main]
t2 release the father lock, Class class com.blackfish.bill.billlist.Father, Address com.blackfish.bill.billlist.Father@4178d239, ThreadInfo Thread[Thread-1,5,main]
上边的输出可以看出下边2点:
1.内置锁是可重入的
t1 hold the son lock, Class class com.blackfish.bill.billlist.Son, Address com.blackfish.bill.billlist.Son@48e0ce1c, ThreadInfo Thread[Thread-0,5,main]
t1 hold the father lock, Class class com.blackfish.bill.billlist.Son, Address com.blackfish.bill.billlist.Son@48e0ce1c, ThreadInfo Thread[Thread-0,5,main]
2.同一个对象的锁,在同一时刻只能由一个线程持有
t3 hold the father lock, Class class com.blackfish.bill.billlist.Father, Address com.blackfish.bill.billlist.Father@4178d239, ThreadInfo Thread[Thread-2,5,main]
t3 release the father lock, Class class com.blackfish.bill.billlist.Father, Address com.blackfish.bill.billlist.Father@4178d239, ThreadInfo Thread[Thread-2,5,main]
t2 hold the father lock, Class class com.blackfish.bill.billlist.Father, Address com.blackfish.bill.billlist.Father@4178d239, ThreadInfo Thread[Thread-1,5,main]
3.初始化子类前,会先初始化父类
Father init
Son init