偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

[[203865]]

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

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

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

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

借助CAS(AtomicReference)實(shí)現(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的實(shí)現(xiàn)。

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

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

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

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

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

2017-09-18 09:03:36

線程安全單例

2024-11-26 07:29:57

高并發(fā)線程安全

2025-06-26 00:40:13

2021-02-07 23:58:10

單例模式對(duì)象

2024-02-22 10:02:03

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

2021-04-15 09:18:22

單例餓漢式枚舉

2021-03-15 07:02:02

java線程安全

2020-10-10 10:20:11

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

2014-06-26 09:36:02

Angular評(píng)論應(yīng)用

2024-03-06 08:09:47

單例模式軟件

2023-03-30 13:22:45

nginxweb服務(wù)器

2023-03-21 09:07:38

HashMap線程安全

2024-06-04 08:32:40

2021-11-15 10:35:46

Python線程代碼

2022-03-09 09:43:01

工具類線程項(xiàng)目

2015-10-27 09:19:24

2021-07-26 06:57:59

Synchronize線程安全

2024-04-24 10:38:22

2024-12-31 11:40:05

2017-12-06 16:28:48

Synchronize實(shí)現(xiàn)原理
點(diǎn)贊
收藏

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