Java高并发编程(四)---并发容器

Queue

 队列Queue是一个并发容器

 static Queue<String> tickets = new ConcurrentLinkedQueue<>();

用这一条语句来生成一个链表实现的队列,它是支持多线程的。

 String s = tickets.poll();

用这一条语句来取出队列中的值,这一条语句具有原子性。

ConcurrentHashMap
ConcurrentSkipListMap
Hashtable
HashMap

统一使用方法:

 		Map<String,String> map = new XXXX<>();
 比如:	Map<String,String> map = new ConcurrentSkipListMap<>();

以上容器都属于并发类容器,其方法均具有原子性!使用上述容器装载高并发读写增减的对象比较合适且高效。


synchronizedMap

 这是一个特殊的方法,可以把不加锁的Map变成加锁的Map,如下

 public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)

注意:Java1.8之后,synchronized的效率并不低了!

复制容器(copy on write)

 List<String> lists = new CopyOnWriteArrayList<>();

多线程环境下,写时效率低,读时效率高,比较适合写少读多的环境。

SynchronizedList

 List<String> strs = new ArrayList<>();
 List<String> strsSync = Colletions.synchronizedList(strs);

给不加锁的容器加上锁

阻塞式容器(LinkedBlockingQueue)

 static BlockingQueue<String> strs = new LinkedBlockingQueue<>();
 ...
 strs.put( "a" + i );	//如果满了,就会等待
 strs.take();		  	//如果空了,就会等待
 ...

此类容器不用担心出错

阻塞式容器(ArrayBlockingQueue)

static BlockingQueue<String> strs = new ArrayBlockingQueue<>();
...
strs.put( "a" + i );
...
strs.offer("aaa");		//这个功能和put相似,都是往容器里加东西,不同的是,offer不会提示加没加成功,只能通过返回的布尔值判断
...
strs.offer("aaa", 1, TimeUnit.SECONDS);				//可设置过时,1秒钟之后没加成功就放弃了

此类容器不用担心出错

阻塞式容器(DelayQueue)

此容器中的每一个元素都自己记载着自己还有多长时间被消费者拿走,等待时间长的排在前面,先被拿走。

static BlockingQueue<String> strs = new DelayQueue<>();

此容器可以应用在定时任务上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值