同步

參考資料:(https://openhome.cc/Gossip/JavaEssence/Synchronized.html)

1.鎖定方法

public synchronized void put(int d) {
    data[index] = d;
    index++;
}

倘若確定範圍,可以用第二種方法

2.鎖定範圍

public void put(int d) {
    ...
    synchronized(this) { 
        data[index] = d;
        index++;
    }
    ...
}

倘若有幾個地方都需要被鎖定,但這些地方的資料各自獨立,不會有data1 同時出現在三個method 的狀況,只是為了避免多個執行續同時進入同一個method,所以需要鎖定。那可以給這幾個地方new Object() 拿來當鑰匙,這樣就可以達到更細部的控制。而不會每個執行緒都卡在一起。

3.鎖定鑰匙(key、lock、Object)

public class Material {
    private int data1 = 0;
    private int data2 = 0;
    private Object lock1 = new Object();
    private Object lock2 = new Object();

    public void doSome() {
        ...
        synchronized(lock1) {
            ...
            data1++;
            ...
        }
        ...
    }

    public void doOther() {
        ...
        synchronized(lock2) {
            ...
            data2--;
            ...
        }
        ...
    }
}

Last updated