常见的非阻塞队列
来源:互联网 发布:node 编辑:程序博客网 时间:2024/04/30 11:43
常见的非阻塞队列
1) ConcurrentHashMap
2) ConcurrentSkipListMap
3) ConcurrentSkipListSet
4) ConcurrentLinkedQueue
5) ConcurrentLinkedDeque
6) CopyOnWriteArrayList
7) CopyOnWriteArraySet
HashTable、Vector调用iterator()方法返回Iterator对象后,再调用remove()时会出现ConcurrentModificationException异常,也就是并不支持Iterator并发的删除。
- ConcurrentHashMap是 弱一致性模型
- ConcurrentSkipListMap 并发程序中可以保证顺序
public class MyService { public ConcurrentSkipListMap map = new ConcurrentSkipListMap(); public MyService(){ UserInfo user1 = new UserInfo(1, "user1"); UserInfo user2 = new UserInfo(2, "user2"); UserInfo user3 = new UserInfo(3, "user3"); UserInfo user4 = new UserInfo(4, "user4"); UserInfo user5 = new UserInfo(5, "user5"); map.put(user1, "value1"); map.put(user4, "value4"); map.put(user2, "value2"); map.put(user5, "value5"); map.put(user3, "value3"); }}public class ThreadA extends Thread { private MyService myservice; public ThreadA(MyService myservice){ this.myservice = myservice; } @Override public void run() { while(!myservice.map.isEmpty()){ Map.Entry entry = myservice.map.pollFirstEntry(); UserInfo userInfo = (UserInfo) entry.getKey(); System.out.println("key = " + userInfo.getId() + entry.getValue()); } }}
- ConcurrentSkipListSet 支持排序且不允许重复的元素
ConcurrentLinkedQueue 提供了并发环境的队列操作
方法poll当没有获得数据时返回null,如果有数据则移除表头,并将表头进行返回
方法element当没有数据时,出现NoSuchElementExcepiton异常,如果有数据则返回表头项
方法peek当没有数据时返回null,有数据则不移除表头,返回表头项ConcurrentLinkedDeque
public class AddTask implements Runnable { private ConcurrentLinkedDeque<String> list; public AddTask(ConcurrentLinkedDeque<String> list){ this.list = list; } @Override public void run() { String name = Thread.currentThread().getName(); for(int i=0;i<1000;i++){ list.add(name+"--" + (i+1)); } }}public class RemoveTask implements Runnable{ private ConcurrentLinkedDeque list; public RemoveTask(ConcurrentLinkedDeque list){ this.list = list; } @Override public void run() { String name = Thread.currentThread().getName(); for(int i=0;i<500;i++){ list.pollFirst(); list.pollLast(); } }}public class Main { public static void main(String[] args) throws InterruptedException { ConcurrentLinkedDeque<String> list = new ConcurrentLinkedDeque<>(); Thread[] threads = new Thread[100]; for(int i=0;i<threads.length;i++){ AddTask task = new AddTask(list); threads[i] = new Thread(task); threads[i].start(); } System.out.printf("Main %d AddTask have been launched\n", threads.length); for(int i=0;i<threads.length;i++){ threads[i].join(); } System.out.printf("Main size of threads %d\n", list.size()); for(int i=0;i<threads.length;i++){ RemoveTask removeTask = new RemoveTask(list); threads[i] = new Thread(removeTask); threads[i].start(); } System.out.printf("Main %d RemoveTask have been launched\n", threads.length); for(int i=0;i<threads.length;i++){ threads[i].join(); } System.out.printf("Main size of threads %d\n", list.size()); }}
CopyOnWriteArrayList
CopyOnWriteArraySet
0 0
- 常见的非阻塞队列
- 等待队列 阻塞非阻塞
- IO 的阻塞和非阻塞一:等待队列
- java阻塞队列以及非阻塞队列
- java阻塞队列与非阻塞队列
- 阻塞队列与非阻塞队列
- 阻塞队列和非阻塞队列
- java 中 阻塞队列 非阻塞队列 和普通队列的区别是什么?
- java 中 阻塞队列 非阻塞队列 和普通队列的区别是什么
- java 中 阻塞队列 非阻塞队列 和普通队列的区别是什么?
- (原创)JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
- JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
- JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
- Posix消息队列使用非阻塞mq_receive的信号通知
- Java生产者-消费者模式的非阻塞队列实现
- 阻塞队列与非阻塞队列区别应用场景
- java5中的阻塞队列BlockingQueue和非阻塞队列ConcurrentLinkedQueue
- JAVA阻塞队列LinkedBlockingQueue以及非阻塞队列ConcurrentLinkedQueue区别
- Angular+require单页面智能路由,链接参数化练手。
- Candies_poj3159_差分约束
- WebSocket握手协议
- 13.Spring学习笔记_通过注解配置Bean(by尚硅谷_佟刚)
- 肖特基二极管和快恢复二极管区别
- 常见的非阻塞队列
- Spring+Websocket实现消息的推送
- ViewPage的无限循环(五)
- QT5 检测 usb设备插拔
- openwrt下的 软件包的make分析
- java除法 保留两位小数
- 2016_S&P_Beauty and the Beast: Diverting modern web browsers to build unique browser fingerprints翻译
- win7 访问linuxsamba“ 此账户并未得到从这个工作站登录的授权
- javascript中定义变量var,const,let简单的区别