`

java数据结构:ConcurrentSkipListSet<E>与CopyOnWriteArraySet<E>

 
阅读更多

 


分类: java_数据结构 java_线程 313人阅读 评论(0) 收藏 举报
[java] view plaincopy
  1. import java.util.concurrent.ConcurrentSkipListSet;  
  2. import java.util.concurrent.ExecutorService;  
  3. import java.util.concurrent.Executors;  
  4.   
  5. import org.junit.Test;  
  6.   
  7. /** 
  8.  * @author amber2012 
  9.  *  
  10.  * 1、ConcurrentSkipListSet<E>: 
  11.  *      public class ConcurrentSkipListSet<E> extends AbstractSet<E>  
  12.  *                      implements NavigableSet<E>, Cloneable, Serializable 
  13.  *  
  14.  *  关于ConcurrentSkipListSet<E>在jdk的API的文档说明: 
  15.  *      1)ConcurrentSkipListSet<E>是jdk6新增的类,位于java.util.concurrent并发库下; 
  16.  *  
  17.  *      2)ConcurrentSkipListSet<E>和TreeSet一样,都是支持自然排序,并且可以在构造的时候定义Comparator<E> 
  18.  *      的比较器,该类的方法基本和TreeSet中方法一样(方法签名一样); 
  19.  *  
  20.  *      3)和其他的Set集合一样,ConcurrentSkipListSet<E>都是基于Map集合的,ConcurrentSkipListMap便是它的底层实现; 
  21.  *  
  22.  *      4)在多线程的环境下,ConcurrentSkipListSet<E>中的contains、add、remove操作是安全的,多个线程可以安全地并发 
  23.  *      执行插入、移除和访问操作。但是对于批量操作 addAll、removeAll、retainAll 和 containsAll并不能保证以原子方式执行, 
  24.  *      理由很简单,因为addAll、removeAll、retainAll底层调用的还是contains、add、remove的方法,在批量操作时,只能保证 
  25.  *      每一次的contains、add、remove的操作是原子性的(即在进行contains、add、remove三个操作时,不会被其他线程打断),而 
  26.  *      不能保证每一次批量的操作都不会被其他线程打断。 
  27.  *       
  28.  *      5)此类不允许使用 null 元素,因为无法可靠地将 null 参数及返回值与不存在的元素区分开来。  
  29.  *  
  30.  * 2、public class CopyOnWriteArraySet<E>extends AbstractSet<E>implements Serializable 
  31.  *      对于CopyOnWriteArraySet<E>类: 
  32.  *      1)它最适合于具有以下特征的应用程序:set 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。  
  33.  *      2)它是线程安全的, 底层的实现是CopyOnWriteArrayList;   
  34.  *      3)因为通常需要复制整个基础数组,所以可变操作(add、set 和 remove 等等)的开销很大。  
  35.  *      4)迭代器不支持可变 remove 操作。  
  36.  *      5)使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。  
  37.  *  
  38.  */  
  39. public class ConcurrentSkipListSetTest {  
  40.       
  41.     private static ConcurrentSkipListSet<Student> listSet = new ConcurrentSkipListSet<Student>();  
  42.       
  43.     static {  
  44.         for(int i = 1; i <= 30; i++){  
  45.             listSet.add(new Student(new Long(i)));  
  46.         }  
  47.     }  
  48.       
  49.     public static void main(String[] args) {  
  50.           
  51.         ExecutorService threadPool = Executors.newFixedThreadPool(3);  
  52.         threadPool.execute(new Runnable() {  
  53.             public void run() {  
  54.                 while(listSet.size() != 0){  
  55.                     sop(Thread.currentThread().getName()+ " : " + listSet.pollFirst()); //获取并移除第一个(最低)元素  
  56.                 }  
  57.             }  
  58.         });  
  59.           
  60.         threadPool.execute(new Runnable() {  
  61.             public void run() {  
  62.                 while(listSet.size() != 0){  
  63.                     sop(Thread.currentThread().getName()+ " : " + listSet.pollLast()); //获取并移除最后(最高)元素  
  64.                 }  
  65.             }  
  66.         });  
  67.           
  68.         threadPool.execute(new Runnable() {  
  69.             public void run() {  
  70.                 while(listSet.size() != 0){  
  71.                     sop(Thread.currentThread().getName()+ " : " + listSet.pollFirst()); //获取并移除第一个(最低)元素  
  72.                 }  
  73.             }  
  74.         });  
  75.     }  
  76.       
  77.     @Test  
  78.     public void test(){  
  79.     }  
  80.       
  81.     private static void sop(Object obj){  
  82.         System.out.println(obj);  
  83.     }  
  84. }  
分享到:
评论

相关推荐

    java集合-ConcurrentSkipListSet的使用

    ConcurrentSkipListSet 是Java中的一个线程安全的有序集合类,它基于跳表(Skip List)数据结构实现。 下面是关于 ConcurrentSkipListSet 的一些重要信息: 线程安全性:ConcurrentSkipListSet 是线程安全的,可以...

    Java concurrency集合之ConcurrentSkipListSet_动力节点Java学院整理

    主要为大家详细介绍了Java concurrency集合之ConcurrentSkipListSet的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    高级java笔试题-tip:自写博客、博客收藏、开源项目收藏

    线程安全set:ConcurrentSkipListSet、CopyOnWriteArraySet、ConcurrentHashMap.newKeySet()、Collections.synchronizedSet(set) 分布式技术 缓存穿透: 请求去查询缓存数据库中根本就不存在的数据。解决方案: 缓存...

    Java并发包讲解

    2.HashSet,TreeSet -- CopyONWriteArraySet,ConcurrentSkipListSet 3.hashMap , treeMap -- ConcurrentHashMap,ConcurentSkipListMap(key有序,支持更高并发) ## Concurrent同步工具类 countDownLatch ...

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    集合效率不完全皮恩车

    以循环1000000万次为标准! 定义如下数组 public static char[] chars = {'A','B','C'...ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet…, HashSet JobStateReasons , LinkedHashSet , TreeSet Map接口 …….

    并发编程笔记20190526.docx

    第一章 线程基础、线程之间...1. ConcurrentSkipListMap和ConcurrentSkipListSet: 60 2. 写时复制容器 60 五、阻塞队列 60 第五章 JMH性能测试 62 1、 JMH环境搭建 62 2、 执行 63 3、 基本概念 63 4、 注解与选项 63

Global site tag (gtag.js) - Google Analytics