1. 程式人生 > >類鎖與物件鎖例項

類鎖與物件鎖例項

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是併發的。說明物件鎖的獲取與類鎖的獲取是不影響的,可以併發。