您好,登錄后才能下訂單哦!
本篇文章為大家展示了Java中怎么初始化ConcurrentHashMap,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
首先看一下代碼
private final Node<K,V>[] initTable() { Node<K,V>[] tab; int sc; while ((tab = table) == null || tab.length == 0) { // 第一次檢查 if ((sc = sizeCtl) < 0) Thread.yield(); // lost initialization race; just spin else if (U.compareAndSwapInt(this, SIZECTL, sc, -1)) { try { if ((tab = table) == null || tab.length == 0) {// 第二次檢查 int n = (sc > 0) ? sc : DEFAULT_CAPACITY; @SuppressWarnings("unchecked") Node<K,V>[] nt = (Node<K,V>[])new Node<?,?>[n]; table = tab = nt; sc = n - (n >>> 2); } } finally { sizeCtl = sc; } break; } } return tab; }
ConcurrentHashMap在初始化時,如何進行多線程間的同步?
ConcurrentHashMap
在初始化時,首先會判斷,哈希表是否已經初始化了。如果沒有,則嘗試進行初始化。
首先會判斷sizeCtl
的值。sizeCtl是用于多線程之間同步的一個互斥變量。當sizeCtl < 0時,表示已經有線程正在初始化哈希表或哈希表正在擴容,此時,不能再進行操作。
此處sizeCtl其實是實現了自旋鎖的功能。自旋鎖,即,獲取鎖失敗時,讓出CPU,稍后再進行嘗試,重復這個過程,直到獲得到鎖為止。讓出CPU的動作,是通過java中的Thread.yield()
來實現的。在學校學習java的時候曾經接觸過線程的這個方法,但當時不明白什么場景下會用到。原來,Thread.yield()方法可以用來實現自旋鎖。
上述內容就是Java中怎么初始化ConcurrentHashMap,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。