国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java證明ArrayList和HashMap的非線程安全性

_Suqin / 2414人閱讀

摘要:眾所周知這兩個結構都不是線程安全的對于可以通過多個線程向其添加元素若它不是線程安全的則最后它實際存儲的元素數量很可能不等于實際添加的元素數量的驗證方法也類似需要注意的是這里的線程不安全指的是原子操作比如這種得不到預期效果而不是和這樣一組操作

眾所周知, 這兩個結構都不是線程安全的.對于ArrayList, 可以通過多個線程向其添加元素, 若它不是線程安全的, 則最后它實際存儲的元素數量很可能不等于實際添加的元素數量.HashMap的驗證方法也類似

需要注意的是, 這里的線程不安全指的是原子操作, 比如add這種, 得不到預期效果, 而不是addget這樣一組操作. 在原子操作線程安全的情況下, 一組原子操作也是線程不安全的, 需要另外加鎖.

證明ArrayList的非線程安全性

package com.ibm.javacore.collections.threadsafe;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class ThreadSafeDemo {
    public static int demo(final List list, final int testCount) throws InterruptedException {
        ThreadGroup group = new ThreadGroup(list.getClass().getName() + "@" + list.hashCode()); 
        final Random rand = new Random(); 
        
        Runnable listAppender = new Runnable() {
            public void run() {
                try {
                    Thread.sleep(rand.nextInt(2));
                } catch (InterruptedException e) {
                    return; 
                } 
                list.add("0"); 
            }
        }; 
        
        for (int i = 0; i < testCount; i++) {
            new Thread(group, listAppender, "InsertList-" + i).start(); 
        }
        
        while (group.activeCount() > 0) {
            Thread.sleep(10); 
        }
        
        return list.size(); 
    }
    public static void main(String[] args) throws InterruptedException {
        List unsafeList = new ArrayList(); 
        List safeList = Collections.synchronizedList(new ArrayList()); 
        final int N = 10000; 
        for (int i = 0; i < 10; i++) {
            unsafeList.clear(); 
            safeList.clear(); 
            int unsafeSize = demo(unsafeList, N); 
            int safeSize = demo(safeList, N); 
            System.out.println("unsafe/safe: " + unsafeSize + "/" + safeSize); 
        }
    }
}

證明HashMap的非線程安全性

package com.concurrence;

import java.util.HashMap;

public class ThreadNotSafeHashmap {
    public static void main(String args[]) throws InterruptedException {
        final HashMap firstHashMap = new HashMap();
        Thread t1 = new Thread() {
            public void run() {
                for (int i = 0; i < 2500; i++) {
                    firstHashMap.put(String.valueOf(i), String.valueOf(i));
                }
            }
        };
        Thread t2 = new Thread() {
            public void run() {
                for (int j = 2500; j < 5000; j++) {
                    firstHashMap.put(String.valueOf(j), String.valueOf(j));
                }
            }
        };
        t1.start();
        t2.start();

        Thread.sleep(1000);
        for (int k = 0; k < 5000; k++) {
            if (!String.valueOf(k).equals(firstHashMap.get(String.valueOf(k)))) {
                System.err.println(String.valueOf(k) + ":" + firstHashMap.get(String.valueOf(k)));
            }
        }
    }
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65127.html

相關文章

  • Java線程線程安全與異步執行

    摘要:同步包裝器任何集合類使用同步包裝器都會變成線程安全的,會將集合的方法使用鎖加以保護,保證線程的安全訪問。線程池中的線程執行完畢并不會馬上死亡,而是在池中準備為下一個請求提供服務。 多線程并發修改一個數據結構,很容易破壞這個數據結構,如散列表。鎖能夠保護共享數據結構,但選擇線程安全的實現更好更容易,如阻塞隊列就是線程安全的集合。 線程安全的集合 Vector和HashTable類提供了線...

    taoszu 評論0 收藏0
  • HashMap 你真的了解嗎?

    摘要:加載因子是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數超出了加載因子與當前容量的乘積時,則要對該哈希表進行操作即重建內部數據結構,從而哈希表將具有大約兩倍的桶數。 showImg(https://upload-images.jianshu.io/upload_images/4565148-98b22ba5ae7d9723.jpg?imageMogr2/auto-...

    RdouTyping 評論0 收藏0
  • 這幾道Java集合框架面試題在面試中幾乎必問

    摘要:若遇到哈希沖突,則將沖突的值加到鏈表中即可。之后相比于之前的版本,之后在解決哈希沖突時有了較大的變化,當鏈表長度大于閾值默認為時,將鏈表轉化為紅黑樹,以減少搜索時間。有序,唯一紅黑樹自平衡的排序二叉樹。 本文是最最最常見Java面試題總結系列第三周的文章。主要內容: Arraylist 與 LinkedList 異同 ArrayList 與 Vector 區別 HashMap的底層...

    bigdevil_s 評論0 收藏0
  • 集合小記

    摘要:解決沖突開放定址法拉鏈法表解決沖突開放定址法再哈希法鏈地址法建立公共溢出區并發包中的線程安全的集合容器線程安全的,不允許為,默認個的數組,每個中實現就是了,通過定位。基于數組,線程安全的集合類,容量可以限制。 List   List?元素是有序的、可重復,實現List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。   ArrayList:動態數組...

    alaege 評論0 收藏0
  • Java集合總結

    摘要:概述集合類主要有大分支,及。不能保證元素的排列順序,順序有可能發生變化不是同步的集合元素可以是但只能放入一個是接口的唯一實現類,可以確保集合元素處于排序狀態。如果這兩個的通過比較返回,新添加的將覆蓋集合中原有的,但不會覆蓋。 概述 Java集合類主要有2大分支,Collection及Map。Collection體系如下: https://upload-images.jianshu......

    toddmark 評論0 收藏0

發表評論

0條評論

_Suqin

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<