自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

不使用synchronized和lock,如何實現(xiàn)一個線程安全的單例?(二)

安全 應(yīng)用安全
CAS的一個重要缺點在于如果忙等待一直執(zhí)行不成功(一直在死循環(huán)中),會對CPU造成較大的執(zhí)行開銷。

[[203865]]

如果不那么吹毛求疵的話,可以使用枚舉、靜態(tài)內(nèi)部類以及餓漢模式來實現(xiàn)單例模式。見:不使用synchronized和lock,如何實現(xiàn)一個線程安全的單例? 但是,上面這幾種方法其實底層也都用到了synchronized,那么有沒有什么辦法可以不使用synchronized和lock,如何實現(xiàn)一個線程安全的單例?

答案是有的,那就是CAS。關(guān)于CAS,我博客中專門有一篇文章介紹過他,很多樂觀鎖都是基于CAS實現(xiàn)的。這里簡單介紹一下,詳細(xì)內(nèi)容見 樂觀鎖的一種實現(xiàn)方式——CAS

CAS是項樂觀鎖技術(shù),當(dāng)多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程并不會被掛起,而是被告知這次競爭中失敗,并可以再次嘗試。

在JDK1.5 中新增java.util.concurrent(J.U.C)就是建立在CAS之上的。相對于對于synchronized這種阻塞算法,CAS是非阻塞算法的一種常見實現(xiàn)。所以J.U.C在性能上有了很大的提升。

借助CAS(AtomicReference)實現(xiàn)單例模式:

  1. public class Singleton { 
  2.     private static final AtomicReference<Singleton> INSTANCE = new AtomicReference<Singleton>();  
  3.  
  4.     private Singleton() {} 
  5.  
  6.     public static Singleton getInstance() { 
  7.         for (;;) { 
  8.             Singleton singleton = INSTANCE.get(); 
  9.             if (null != singleton) { 
  10.                 return singleton; 
  11.             } 
  12.  
  13.             singleton = new Singleton(); 
  14.             if (INSTANCE.compareAndSet(null, singleton)) { 
  15.                 return singleton; 
  16.             } 
  17.         } 
  18.     } 

代碼比較簡單,稍微了解一下AtomicReference的原理就可以看得懂。不了解的建議去看下,了解下這些CAS的實現(xiàn)。

用CAS的好處在于不需要使用傳統(tǒng)的鎖機(jī)制來保證線程安全,CAS是一種基于忙等待的算法,依賴底層硬件的實現(xiàn),相對于鎖它沒有線程切換和阻塞的額外消耗,可以支持較大的并行度。

CAS的一個重要缺點在于如果忙等待一直執(zhí)行不成功(一直在死循環(huán)中),會對CPU造成較大的執(zhí)行開銷。

【本文是51CTO專欄作者Hollis的原創(chuàng)文章,作者微信公眾號Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2017-09-18 09:03:36

線程安全單例

2024-11-26 07:29:57

高并發(fā)線程安全

2021-02-07 23:58:10

單例模式對象

2024-02-22 10:02:03

單例模式系統(tǒng)代碼

2021-04-15 09:18:22

單例餓漢式枚舉

2024-03-06 08:09:47

單例模式軟件

2014-06-26 09:36:02

Angular評論應(yīng)用

2021-03-15 07:02:02

java線程安全

2020-10-10 10:20:11

云計算云安全技術(shù)

2023-03-30 13:22:45

nginxweb服務(wù)器

2015-10-27 09:19:24

2022-03-09 09:43:01

工具類線程項目

2021-11-15 10:35:46

Python線程代碼

2021-07-26 06:57:59

Synchronize線程安全

2023-03-21 09:07:38

HashMap線程安全

2017-12-06 16:28:48

Synchronize實現(xiàn)原理

2024-06-04 08:32:40

2024-12-31 11:40:05

2024-02-26 07:36:09

lockJava語言

2024-04-24 10:38:22

點贊
收藏

51CTO技術(shù)棧公眾號