類鎖與物件鎖例項
阿新 • • 發佈:2018-11-07
public class Radio { public static synchronized void classLock() { String name = Thread.currentThread().getName(); System.out.println("classLock begin, " + name); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("classLock end, " + name); } public synchronized void instanceLock() { String name = Thread.currentThread().getName(); System.out.println(">>>>>instanceLock begin, " + name); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(">>>>>instanceLock end, " + name); } public static void main(String[] args) { new Thread(() -> { Radio.classLock(); }, "c1").start(); new Thread(() -> { new Radio().classLock(); }, "c2").start(); new Thread(() -> {new Radio().classLock(); }, "c3").start(); Radio r = new Radio(); new Thread(() -> { r.instanceLock(); }, "i1").start(); new Thread(() -> { r.instanceLock(); }, "i2").start(); new Thread(() -> { new Radio().instanceLock(); }, "i3").start(); } }
上圖的執行過程:
c1、c2、c3之間是互斥的。說明類鎖不管是物件呼叫(相同的物件還是不同的物件)還是類名呼叫,都是互斥的。
i1與i3是併發的, i1與i2是互斥的。說明物件鎖只作用於相同物件。
i1、i3與c1是併發的。說明物件鎖的獲取與類鎖的獲取是不影響的,可以併發。