Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。
注:什么叫线程安全?这个首先要明确。线程安全的类 ,指的是类内共享的全局变量的访问必须保证是不受多线程形式影响的。如果由于多线程的访问(比如修改、遍历、查看)而使这些变量结构被破坏或者针对这些变量操作的原子性被破坏,则这个类就不是线程安全的。
一、BlockingQueue接口的具体实现类:
1. ArrayBlockingQueue,其构造函数必须带一个int参数来指明其大小
2. LinkedBlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定
3. PriorityBlockingQueue,其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序
BlockingQueue提供的常用方法:
| 可能报异常 |
返回布尔值 |
可能阻塞 |
设定等待时间 |
|||||
| 入队 |
add(e) |
offer(e) |
put(e) |
offer(e, timeout, unit) |
||||
| 出队 |
||||||||

本文探讨了Java中线程安全的队列,重点比较了阻塞队列BlockingQueue(如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue)与非阻塞队列ConcurrentLinkedQueue。 BlockingQueue在添加和移除元素时可能会阻塞线程,而ConcurrentLinkedQueue利用无锁机制保证线程安全。文章提醒在使用ConcurrentLinkedQueue时需要注意非原子操作的安全问题,并介绍了非阻塞算法的优势和应用。
最低0.47元/天 解锁文章
1800

被折叠的 条评论
为什么被折叠?



