??? 在做多線程程序時我們可能要對某段代碼的同步是有條件的,只有對滿足同一條件的請求才排隊訪問,對與不滿足這樣條件的請求可以并發(fā)訪問,在處理這樣的需求的時候我們可以容易的想到,對于這個特定的條件做一個抽象,讓它作為我們同步鎖。下面的代碼可以說明這個處理過程:
?1?


?2?
//?定義鎖
?3?
private?Map?locks?=?new?HashMap();
?4?
private?Object?getLock(Object?key)?{
?5?
????synchronized?(locks)?{
?6?
????????if?(!locks.containsKey(key))?{
?7?
????????????locks.put(key,?new?Object());
?8?
????????}
?9?
????????return?locks.get(key);
10?
????}
11?
}
12?


13?
//?需要同步的代碼
14?
synchronized?(getLock(id))?{
15?
????//?TODO
16?
}
17?


18?