`

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 concurrency集合之CopyOnWriteArraySet_动力节点Java学院整理

    extends E&gt; c)`: 通过指定的集合创建一个新的CopyOnWriteArraySet,包含所有集合中的元素。 - 其他标准的Set接口方法,如`add()`, `addAll()`, `clear()`, `contains()`, `containsAll()`, `equals()`, `isEmpty()`...

    Java并发编程与高并发解决方案之并发容器(J.U.C).docx

    与`ConcurrentSkipListSet`类似,它也使用跳表作为底层数据结构,能够提供高效的并发访问能力。 **应用场景:** - 需要排序功能,并且对性能有较高要求的场景。 #### AQS同步组件 AQS...

    20个最佳的Java集合框架面试题目.zip

    面试中,Java集合框架的题目通常会测试应聘者对数据结构、算法以及API的理解。以下是对Java集合框架的一些核心知识点的详细阐述: 1. **集合与接口**:Java集合框架包括List、Set和Queue等接口,它们都是继承自...

    JAVA并发容器代码随读1

    Java并发容器是Java多线程编程中的重要工具,它们提供了高效、线程安全的数据结构,使得在并发环境下处理数据变得更加简单。在`java.util.concurrent`包中,有四种主要的并发容器类型:队列(BlockingQueue)、Map...

    Java常见的线程安全的类.docx

    Java中的线程安全是多线程编程中一个重要的概念,主要涉及到并发访问数据结构时的正确性和一致性。线程安全的实现方式多种多样,包括使用synchronized关键字、原子类、阻塞队列以及特定的并发集合类等。下面将详细...

    14个Java并发容器,你用过几个?.docx

    Java并发编程中,为了在多线程环境下保证数据的一致性和安全性,`java.util.concurrent`包提供了多种线程安全的容器。以下是对标题和描述中提及的一些并发容器的详细解释: 1. **ConcurrentHashMap**: 是线程安全的...

    多线程编程.docx

    - **ConcurrentSkipListMap**:实现了`NavigableMap`接口,提供了一个基于跳表的数据结构,保证了对数级别的性能。 - **Set容器**: - **ConcurrentSkipListSet**:基于跳表实现的`NavigableSet`。 - **...

    并发容器的原理,7大并发容器详解、及使用场景

    3. ConcurrentSkipListMap 和 ConcurrentSkipListSet 基于跳表(Skip List)数据结构,提供了一个可并发访问的有序映射和集合。跳表允许快速查找,同时保持插入和删除操作的高效性。 4. ConcurrentLinkedQueue 是一...

    并发编程笔记20190526.docx

    - **写时复制容器**:如CopyOnWriteArrayList和CopyOnWriteArraySet,读操作无锁,写操作复制原有数据结构。 ### 第五章 JMH性能测试 1. **JMH(Java Microbenchmark Harness)**:用于编写和运行微基准测试,...

    集合效率不完全皮恩车

    在Java编程语言中,集合框架是处理数据的重要组成部分。这里我们关注的是集合的效率,特别是针对不同实现的List、Set接口以及Map接口的性能对比。通过对数组`chars`进行1000000万次操作,我们可以评估各种集合类在...

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

    4. `Stack` 是`Vector`的一个子类,实现栈数据结构,线程安全。 `Set`接口不允许有重复元素,常见的实现类有`HashSet`和`TreeSet`: 1. `HashSet` 通过`HashMap`实现,无序且不保证元素顺序,非线程安全。 2. `...

Global site tag (gtag.js) - Google Analytics