業務鎖優化

       普通業務鎖的處理可能只是 加 ‘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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章