//鎖行爲
public static <T,R>R doWithLock(String key,Object method,T param){
Lock lock = null;
//當然 getLock 和 unlock一個需要一個類似於隨機數的東西來確認:解鈴還須繫鈴人
try {
//獲取鎖
lock = getLock(key);
//上鎖:需要保證阻塞
lock.lock();
//執行結果
return invoke(method,param);
}catch (Exception e) {
throw e;
}finally {
if(null != lock) {
lock.unlock();
}
}
}
//執行方法(當然,這裏面的if else 完全可通過策略模式去做到,只是這裏簡單描述)
private static <T,R>R invoke(Object method, T param) {
if(null == method) {
return null;
}else if(method instanceof Function) {
Function<T, R> function = (Function<T, R>) method;
return function.apply(param);
}else if(method instanceof Consumer) {
Consumer<T> consumer = (Consumer<T>) method;
consumer.accept(param);
return null;
}
return null;
}
這就是jdk8帶來的高級抽象的概念,將加鎖的操作視爲對象,這就屏蔽了業務層面對於鎖的關注,完全只需要關注自己的實現即可,高度封裝。如果考慮更多的話,會考慮在doWithLock方法處throws 一個lockexception,是爲了拋出獲取鎖,加鎖,解鎖過程當中的異常,這樣會提供給業務人員更多的情況考慮。