java.util.concurrent.locks.Lock接口
簡介
在多少線程的線程安全處理方式上大概分為
- synchronized
- lock
- synchronized介紹:JAVA的關(guān)鍵字口猜;可給當(dāng)前的方法加鎖果元,使的線程在執(zhí)行的排隊(duì)
public void getTicks(){
synchronized (Object.class){
//加鎖代碼塊
}
}
優(yōu)缺點(diǎn)分析
- 操作相對簡單芥牌,對簡單的多線程業(yè)務(wù)比較方便
- 暴力加鎖披泪,加鎖除非當(dāng)前線程放開鎖密幔,或者線程死亡 由JVM釋放涣澡,不然會一直拿著鎖闽撤,
- 線程拿不到當(dāng)前鎖的狀態(tài)舱呻,不知道哪個(gè)線程拿到了鎖次企,
- 在進(jìn)行IO操作時(shí)怯晕,一旦由于網(wǎng)絡(luò)等原因,容易造成死鎖
Lock實(shí)現(xiàn)代碼鎖
Lock l = ...;
l.lock();
try {
// access the resource protected by this lock
} finally {
l.unlock();
}
Lock分為樂觀鎖和悲觀鎖
- 樂觀鎖 read鎖缸棵,可以支持多線程同時(shí)獲取
- 悲觀鎖 類似synchronized
優(yōu)缺點(diǎn)
- Lock線程在拿到鎖的時(shí)候舟茶,其他線程可以不斷嘗試獲取鎖,不會一直等待
- 可以設(shè)置超時(shí)時(shí)間堵第,超出后拋出異常
- 支持樂觀鎖
在實(shí)際應(yīng)用中建議使用Lock來進(jìn)行安全操作
分布式鎖
- zk鎖
- redis/memcached緩存鎖
- 可參考文章