阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用Concurrent集合

28次阅读
没有评论

共计 1612 个字符,预计需要花费 5 分钟才能阅读完成。

我们在前面已经通过 ReentrantLockCondition实现了一个BlockingQueue

public class TaskQueue {private final Lock lock = new ReentrantLock();
    private final Condition condition = lock.newCondition();
    private Queue<String> queue = new LinkedList<>();

    public void addTask(String s) {lock.lock();
        try {queue.add(s);
            condition.signalAll();} finally {lock.unlock();
        }
    }

    public String getTask() {lock.lock();
        try {while (queue.isEmpty()) {condition.await();
            }
            return queue.remove();} finally {lock.unlock();
        }
    }
}

BlockingQueue的意思就是说,当一个线程调用这个 TaskQueuegetTask()方法时,该方法内部可能会让线程变成等待状态,直到队列条件满足不为空,线程被唤醒后,getTask()方法才会返回。

因为 BlockingQueue 非常有用,所以我们不必自己编写,可以直接使用 Java 标准库的 java.util.concurrent 包提供的线程安全的集合:ArrayBlockingQueue

除了 BlockingQueue 外,针对 ListMapSetDeque 等,java.util.concurrent包也提供了对应的并发集合类。我们归纳一下:

interface non-thread-safe thread-safe
List ArrayList CopyOnWriteArrayList
Map HashMap ConcurrentHashMap
Set HashSet / TreeSet CopyOnWriteArraySet
Queue ArrayDeque / LinkedList ArrayBlockingQueue / LinkedBlockingQueue
Deque ArrayDeque / LinkedList LinkedBlockingDeque

使用这些并发集合与使用非线程安全的集合类完全相同。我们以 ConcurrentHashMap 为例:

Map<String, String> map = new ConcurrentHashMap<>();
// 在不同的线程读写:
map.put("A", "1");
map.put("B", "2");
map.get("A", "1");

因为所有的同步和加锁的逻辑都在集合内部实现,对外部调用者来说,只需要正常按接口引用,其他代码和原来的非线程安全代码完全一样。即当我们需要多线程访问时,把:

Map<String, String> map = new HashMap<>();

改为:

Map<String, String> map = new ConcurrentHashMap<>();

就可以了。

java.util.Collections工具类还提供了一个旧的线程安全集合转换器,可以这么用:

Map unsafeMap = new HashMap();
Map threadSafeMap = Collections.synchronizedMap(unsafeMap);

但是它实际上是用一个包装类包装了非线程安全的 Map,然后对所有读写方法都用synchronized 加锁,这样获得的线程安全集合的性能比 java.util.concurrent 集合要低很多,所以不推荐使用。

小结

使用 java.util.concurrent 包提供的线程安全的并发集合可以大大简化多线程编程:

多线程同时读写并发集合是安全的;

尽量使用 Java 标准库提供的并发集合,避免自己编写同步代码。

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计1612字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中