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