多執行緒之如何證明sychronized的this鎖存在
阿新 • • 發佈:2018-11-22
這邊是一個簡單的執行緒呼叫
public class SynchronizedThis { public static void main(String[] args) { ThisLock thisLock = new ThisLock(); new Thread("T1") { @Override public void run() { thisLock.m1(); } }.start(); new Thread("T2") { @Override public void run() { thisLock.m2(); } }.start(); } } class ThisLock { public void m1() { try { System.out.println(Thread.currentThread().getName()); Thread.sleep(10_000); } catch (InterruptedException e) { e.printStackTrace(); } } public void m2() { try { System.out.println(Thread.currentThread().getName()); Thread.sleep(10_000); } catch (InterruptedException e) { e.printStackTrace(); } } }
從輸出可以看出T1,T2是同時輸出的,下面加上sychronized改造一下
class ThisLock { private final Object LOCK = new Object(); public void m1() { synchronized(this) { System.out.println(this.getClass().getName()); try { System.out.println(Thread.currentThread().getName()); Thread.sleep(10_000); } catch (InterruptedException e) { e.printStackTrace(); } } } public synchronized void m2() { try { System.out.println(Thread.currentThread().getName()); Thread.sleep(10_000); } catch (InterruptedException e) { e.printStackTrace(); } } }
發現這兩個鎖的是同一個東西,所以一個先輸出一個後輸出
class ThisLock { private final Object LOCK = new Object(); public void m1() { synchronized(LOCK) { try { System.out.println(Thread.currentThread().getName()); Thread.sleep(10_000); } catch (InterruptedException e) { e.printStackTrace(); } } } public synchronized void m2() { try { System.out.println(Thread.currentThread().getName()); Thread.sleep(10_000); } catch (InterruptedException e) { e.printStackTrace(); } } }
最後鎖的是一個物件,然後輸出發現是同時輸出的,說明是兩個不同的鎖,一個是LOCK鎖,一個是this鎖