juc(java.util.concurrent)线程安全集合

    ArrayList是非线程安全的,而Vector是线程安全的,其实现依靠synchronized,效率低。虽然能实现线程安全,但是不符合高并发。

    因此有ConcurrentHashMap、CopyOnWriteArraySet写时复制技术CopyOnWriteArrayList这几个集合框架。这里需要理解一个技术:写时复制技术。

    为了保证线程安全,又要高并发,所以要并发读,独占写。举个例子,有一个集合A,有好多人在读,但是小李想写数据,因此小李先根据集合A复制一个集合B,然后把数据写到集合B,最后,把指向集合A的引用,指向集合B。

代码:

public class NotSafeDemo {

public static void main(String[] args) {

    //notSafeHashSet

    //noSafeArrayList

     notSafeHashMap();

}

private static void notSafeHashMap() {

    Map map =new ConcurrentHashMap<>();

    for (int i =0; i <30; i++) {

        new Thread(() -> {

        map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,4));

        System.out.println(map);

        }, String.valueOf(i)).start();

    }

}

private static void notSafeHashSet() {

    Set hashSet =new CopyOnWriteArraySet();

    for (int i =0; i <30; i++) {

    new Thread(() -> {

        hashSet.add(UUID.randomUUID().toString().substring(0,4));

        System.out.println(hashSet);

    }, String.valueOf(i)).start();

    }

}

private static void noSafeArrayList() {

List list =new CopyOnWriteArrayList();//写时复制技术

//并发写,会报错:java.util.ConcurrentModificationException

   for (int i =0; i <30; i++) {

    new Thread(() -> {

        list.add(UUID.randomUUID().toString().substring(0,4));

        System.out.println(list);

    }, String.valueOf(i)).start();

}

}

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,061评论 0 2
  • 四、集合框架 1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串。生活中很多数据的描述都采...
    佘大将军阅读 786评论 0 2
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 1,442评论 0 6
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,432评论 0 4
  • 这某种暂时不先加以形容的某种情绪 是该给它些空间让打哈欠伸伸腿之类的有起码的张力 于是有人专门孕育无聊时所...
    远方之远阅读 288评论 0 0