普通業務鎖的處理可能只是 加 ‘synchronized ’ 來進行加鎖,會對整個業務進行加鎖,嘗試進行更精準的加鎖。
如:水果買賣業務,業務方法中只存在一個 ‘synchronized ’ 來對業務數據進行安全處理,現在可以通過不同水果各自的鎖來減少等待時間,這樣處理之後,等待鎖的時間會成倍減少,業務越是繁重,那麼效果越會明顯。單這一切的前提是在業務中沒有其他安全性的問題,每一種水果都可以獨立進行數據操作
見代碼:
import java.util.HashMap;
import java.util.Map;
public class Locks extends Thread {
// 鎖集合
private static Map<String, Object> locks = new HashMap<String, Object>();
// 水果剩餘量
public static Map<String, Integer> values = new HashMap<String, Integer>();
// 購買水果的類型
private String type;
// 這個水果鎖對應的鎖
private Object lock;
public Locks(String type) {
this.type = type;
}
// 業務
private void biz() {
synchronized (lock) {
// 減少一個餘量
values.put(type, values.get(type) - 1);
try {
// 一個耗時兩秒的業務
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
synchronized (locks) {
// 獲取這個水果的lock
lock = locks.get(type);
if (null == lock) {
// 沒有,那麼創建
lock = new Object();
// ,可設想對 locks中的鎖進行回收
locks.put(type, lock);
}
}
// 獲取水果鎖之後進行業務
biz();
}
public static void main(String[] args) {
// 假設 兩種水果各有 10 個
values.put("apple", 10);
values.put("banana", 10);
// 同時有很多人進行購買
new Locks("apple").start();
new Locks("apple").start();
new Locks("apple").start();
new Locks("banana").start();
new Locks("banana").start();
new Locks("banana").start();
}
}