1. 程式人生 > >遇到並發,上鎖是個好習慣

遇到並發,上鎖是個好習慣

不能 value ron view clas auto count 關鍵字 擁有

技術分享圖片

“鎖”在我們日常的生活工作中經常會用到,比如離開寢室會鎖房門,不用手機會將屏幕鎖定,這充分保證了個人財產安全和隱私安全。同樣,在程序的世界裏,也有一把鎖,保證程序不會崩潰,保證我們手機錢包裏的錢不會無緣無故變多變少。

鎖(lock)作為用於保護臨界區(critical section)的一種機制,被廣泛應用在多線程程序中。比如 Java 應用程序出現的 synchronized 關鍵字,就是鎖實現的一種方式。下面我們從一個計數器的應用說起,分析下鎖在 Java 程序中的應用。

一個計數器

技術分享圖片

非線程安全,value++ 不是原子性操作,狀態不穩定,需要同步。

同步方法

鎖定實例

技術分享圖片

線程安全,鎖的對象是當前 SafeCounter 的實例,不會影響到另一個 SafeCounter 實例的 getNext() 方法。

鎖定類

技術分享圖片

線程安全,鎖的對象是 SafeCounterWithClass 類,任何實例都會受鎖的影響,一般不這麽用。

lock

技術分享圖片

線程安全,鎖的對象是 lock,可以靈活控制,只鎖真正需要同步的代碼。註意 lock 不能是 null,也不能改變。

更好的 lock

技術分享圖片

線程安全,靈活控制鎖競爭時的處理,擁有更好的性能。

atomic

技術分享圖片

最佳實踐:使用原子操作類,不阻塞,獲得最好的性能。

首發於公眾號:永倫的小屋。

遇到並發,上鎖是個好習慣