前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >这些 Java 并发工具类,还有谁没用过?

这些 Java 并发工具类,还有谁没用过?

作者头像
程序员鱼皮
发布2024-08-20 20:34:29
810
发布2024-08-20 20:34:29
举报
文章被收录于专栏:鱼皮客栈

回答重点

比如:ConcurrentHashMap、AtomicInteger、Semaphore、CyclicBarrier、CountDownLatch、BlockingQueue 等等。

这个问题只要把你知道的一些并发类名字说出来就行了,然后等面试官选择其中一个去询问即可。

具体的分析看扩展知识。

扩展知识

1. ConcurrentHashMap

  • 作用: 是一个线程安全且高效的哈希表,支持并发访问。
  • 用法: 多个线程可以同时进行读写操作,而不会导致线程安全问题。
代码语言:javascript
复制
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key1", 1);
Integer value = map.get("key1");
map.computeIfAbsent("key2", k -> 2);

2. AtomicInteger

  • 作用: 提供一种线程安全的方式对 int 类型进行原子操作,如增减、比较。
  • 用法: 适用于需要频繁对数值进行无锁操作的场景。
代码语言:javascript
复制
AtomicInteger atomicInt = new AtomicInteger(0);
atomicInt.incrementAndGet(); // 递增
atomicInt.decrementAndGet(); // 递减
atomicInt.compareAndSet(1, 2); // 比较并设置

3. Semaphore

  • 作用: 控制访问资源的线程数,可以用来实现限流或访问控制。
  • 用法: 在资源有限的情况下,控制同时访问的线程数量。
代码语言:javascript
复制
Semaphore semaphore = new Semaphore(3);
try {
    semaphore.acquire(); // 获取许可
    // 执行任务
} finally {
    semaphore.release(); // 释放许可
}

4. CyclicBarrier

  • 作用: 让一组线程到达一个共同的同步点,然后一起继续执行。常用于分阶段任务执行。
  • 用法: 适用于需要所有线程在某个点都完成后再继续的场景。
代码语言:javascript
复制
CyclicBarrier barrier = new CyclicBarrier(3, () -> {
    System.out.println("所有线程都到达了屏障点");
});
Runnable task = () -> {
    try {
        // 执行任务
        barrier.await(); // 等待其他线程
    } catch (Exception e) {
        e.printStackTrace();
    }
};
new Thread(task).start();
new Thread(task).start();
new Thread(task).start();

5. CountDownLatch

  • 作用: 一个线程(或多个)等待其他线程完成操作。
  • 用法: 适用于主线程需要等待多个子线程完成任务的场景。
代码语言:javascript
复制
CountDownLatch latch = new CountDownLatch(3);
Runnable task = () -> {
    try {
        // 执行任务
    } finally {
        latch.countDown(); // 任务完成,计数器减一
    }
};
new Thread(task).start();
new Thread(task).start();
new Thread(task).start();
latch.await(); // 等待所有任务完成
System.out.println("所有任务都完成了");

6. BlockingQueue

  • 作用: 是一个线程安全的队列,支持阻塞操作,适用于生产者-消费者模式。
  • 用法: 生产者线程将元素放入队列,消费者线程从队列中取元素,队列为空时消费者线程阻塞。
代码语言:javascript
复制
BlockingQueue<String> queue = new LinkedBlockingQueue<>();
Runnable producer = () -> {
    try {
        queue.put("item"); // 放入元素
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
};
Runnable consumer = () -> {
    try {
        String item = queue.take(); // 取出元素
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
};
new Thread(producer).start();
new Thread(consumer).start();

关联题目(可以直接上 mianshiya.com 搜索)

什么是 Java 的 Semaphore?

什么是 Java 的 CyclicBarrier?

什么是 Java 的 CountDownLatch?

什么是 Java 的 StampedLock?

什么是 Java 的 CompletableFuture?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员鱼皮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 回答重点
  • 扩展知识
    • 1. ConcurrentHashMap
      • 2. AtomicInteger
        • 3. Semaphore
          • 4. CyclicBarrier
            • 5. CountDownLatch
              • 6. BlockingQueue
                • 关联题目(可以直接上 mianshiya.com 搜索)
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档