普通业务锁的处理可能只是 加 ‘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();
}
}