這篇文章帶給大家的內容是關於COW機制已經相關類別的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
COW機制已經相關類別
Vector和SynchronizedList
我們知道ArrayList是用來取代Vector的,Vector是執行緒安全的容器。因為它幾乎在每個方法聲明處都加了synchronized關鍵字來使容器安全。如果使用Collections.synchronizedList(new ArrayList())來使ArrayList變成是線程安全的話,也是幾乎都是每個方法都加上synchronized關鍵字的,只不過它不是加在方法的聲明處,而是方法的內部。
多執行緒下for迴圈迭代Vector或SynchronizedList,進行delete和get操作會發生陣列下標錯誤的例外。
在JDK5以後,Java推薦使用for-each(迭代器)來遍歷我們的集合,好處就是簡潔、陣列索引的邊界值只計算一次。如果使用for-each(迭代器)來做上面的操作,會拋出ConcurrentModificationException異常。
如果想要完美解決上面所講的問題,我們可以在遍歷前加鎖:
遍歷一下容器都要我加上鎖,這這不是要慢死了嗎。的確是挺慢的。因為加鎖粒度太大。
CopyOnWriteArrayList是同步List的替代品,CopyOnWriteArraySet是同步Set的替代品。
Hashtable、Vector加鎖的粒度大(直接在方法聲明處使用synchronized)ConcurrentHashMap、CopyOnWriteArrayList加鎖粒度小(用各種的方式來實現線程安全,例如我們知道的ConcurrentHashMap用了cascas 、volatile等方式來實現線程安全..)JUC下的線程安全容器在遍歷的時候不會拋出ConcurrentModificationException異常所以一般來說,我們都會使用JUC包下給我們提供的線程安全容器,而不是使用老一代的線程安全容器。
CopyOnWriteArrayList實作原理
CopyOnWriteArrayList是線程安全容器(相對於ArrayList),底層透過複製數組的方式來實現。 CopyOnWriteArrayList在遍歷的使用不會拋出ConcurrentModificationException異常,而且遍歷的時候就不用額外加鎖元素可以為null
/** 可重入锁对象 */ final transient ReentrantLock lock = new ReentrantLock(); /** CopyOnWriteArrayList底层由数组实现,volatile修饰 */ private transient volatile Object[] array; final Object[] getArray() { return array; } final void setArray(Object[] a) { array = a; } // 初始化CopyOnWriteArrayList相当于初始化数组 public CopyOnWriteArrayList() { setArray(new Object[0]); }
CopyOnWriteArrayList底層就是數組,加鎖就交由ReentrantLock來完成。
透過程式碼我們可以知道:在add(),set(),remove() 的時候就上鎖,並複製一個新數組,增加操作在新數組上完成,將array指向到新數組中,最後解鎖。在修改時,複製出一個新數組,修改的操作在新數組中完成,最後將新數組交由array變數指向。寫加鎖,讀不加鎖
CopyOnWriteArrayList缺點
內存佔用:如果CopyOnWriteArrayList經常要增刪改裡面的數據,經常要執行add()、set()、remove()的話,那是比較耗費記憶體的。
因為我們知道每次add()、set()、remove()這些增刪改操作都要複製一個陣列出來。
資料一致性:CopyOnWrite容器只能保證資料的最終一致性,無法保證資料的即時一致性。
從上面的例子也可以看出來,例如線程A在迭代CopyOnWriteArrayList容器的資料。線程B在線程A迭代的間隙中將CopyOnWriteArrayList部分的資料修改了(已經呼叫setArray()了)。但是線程A迭代出來的是原有的資料。
#以上是COW機制已經相關類別的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于设计模式的相关问题,主要将装饰器模式的相关内容,指在不改变现有对象结构的情况下,动态地给该对象增加一些职责的模式,希望对大家有帮助。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器