public synchronized void put(int d) {
data[index] = d;
index++;
}
public void put(int d) {
...
synchronized(this) {
data[index] = d;
index++;
}
...
}
倘若有幾個地方都需要被鎖定,但這些地方的資料各自獨立,不會有data1 同時出現在三個method 的狀況,只是為了避免多個執行續同時進入同一個method,所以需要鎖定。那可以給這幾個地方new 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--;
...
}
...
}
}