业务锁优化

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