文章目录

  • java并发包&并发队列
    • 1. 并发下集合(list,map,set)
      • 1.1 list 的线程安全问题
      • 1.2 Set 的线程安全问题
      • 1.3 Map 的线程安全问题
    • 2. 并发包
      • 3.1 CountDownLatch 计数器
      • 3.2 CyclicBarrier
      • 3.3 Semaphore

java并发包&并发队列

1. 并发下集合(list,map,set)

引言:我们都知道 在多线程操作数据会有并发问题,java中的容器(list、map、set)同样是如此,那么对于容器来说,我们该如何解决并发带来的问题呢?

1.1 list 的线程安全问题

  • 使用Vector来代替list
  • Collections.synchronizedList() 可以将所以通过集合Collections.synchronizedList将其转换为一个线程安全的类.
  • java.util.concurrent.CopyOnWriteArrayList(java并发包下的CopyOnWriteArrayList这个类)

1.2 Set 的线程安全问题

  • Collections.synchronizedSet() 可以将所以通过集合Collections.synchronizedSet将其转换为一个线程安全的类.
  • java.util.concurrent.CopyOnWriteArraySet(java并发包下的CopyOnWriteArraySet这个类)

1.3 Map 的线程安全问题

  • 使用HashTable来代替Map

  • Collections.synchronizedMap() 可以将所以通过集合Collections.synchronizedMap将其转换为一个线程安全的类.

  • java.util.concurrent.CopyOnWriteArrayMap(java并发包下的CopyOnWriteArrayMap这个类)

2. 并发包

引言:

​ java中的并发包就是java.util.concurrent—>JUC 在并发包下有许多有用的工具类 如: CountDownLatchCyclicBarrier

3.1 CountDownLatch 计数器

当 N 个线程同时完成某项任务时,如何知道他们都已经执行完毕了或者说主线程等待多个子线程完成任务该怎么实现,你肯定会说join(), join是可以实现但是这样会使你的代码出现多次join,这样不就是很优雅。所以就出现的CountDownLatch

代码演示:

package com.rj.bd.Demo01;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class Test_01 {public static void main(String[] args) throws InterruptedException {ExecutorService pool = Executors.newFixedThreadPool(3);//创建一个线程池CountDownLatch countDownLatch = new CountDownLatch(10);for (int i = 0; i < 3; i++) {Thread t1= new Thread(()->{try {System.out.println("子线程" + Thread.currentThread().getName() + "开始执行");TimeUnit.SECONDS.sleep(1);System.out.println("子线程"+Thread.currentThread().getName()+"执行完成");countDownLatch.countDown();//当前线程调用此方法,则计数器减一} catch (InterruptedException e) {e.printStackTrace();}});pool.execute(t1);}countDownLatch.await();//4.阻塞当前线程,直到计数器的值为0System.out.println("主线程"+Thread.currentThread().getName()+"结束执行...");pool.shutdown();//5.关闭线程池}
}

3.2 CyclicBarrier

通过学习我们知道CountDownLatch是不能重用的,那么如果有需要多线程重用的时候该怎么办,为此就引出了我们接下来要讲的CyclicBarrier类

CyclicBarrier:翻译成中文就是”循环栅栏/障碍“,可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法, 这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏将被重置以便下次使用。

可以理解为:人满发车


代码演示:

package com.rj.bd.Demo01;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Tourist extends Thread {private CyclicBarrier cyclicBarrier;public Tourist(CyclicBarrier cyclicBarrier){this.cyclicBarrier=cyclicBarrier;}@Overridepublic void run() {try {System.out.println("乘客:"+getName()+"已经向巴士车走来");Thread.sleep(2000);System.out.println("乘客:"+getName()+"已经在巴士上坐下了");} catch (InterruptedException e)   {System.out.println("中断异常。。。。");}try {cyclicBarrier.await();System.out.println("乘客:"+getName()+":人满发车喽。。。。。。");} catch (InterruptedException e) {System.out.println("中断异常。。。。");} catch (BrokenBarrierException e) {System.out.println("打破障碍异常(人没到齐非要走).....");}}}
package com.rj.bd.Demo01;import java.util.concurrent.CyclicBarrier;public class Test {public static void main(String[] args) {CyclicBarrier cyclicBarrier=new CyclicBarrier(5,new Runnable() {@Overridepublic void run() {System.out.println("\n最后一个上车的关闭车门。。。。\n");}});for (int i = 0; i < 5; i++) {Tourist writer = new Tourist(cyclicBarrier);writer.start();}}}

3.3 Semaphore

Semaphore可以用于做流量控制,特别公用资源有限的应用场景,比如数据库连接。

Semaphore:是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。

Semaphore可以用来构建一些对象池,资源池之类的,比如数据库连接池,我们也可以创建计数为1的Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态

  1. Semaphore是 synchronized 的加强版,作用是控制线程的并发数量
  2. Seampore类初始化的时候就可以指定阈值(这个阈值就是线程的并发数量)
  3. Seampore经常被用来构建例如资源池,连接池这样的东西(为什么呢。因为这些池是需要一个动态平衡的)
  4. Seampore的阈值为1的时候其功能类似于互斥锁

java并发包并发队列相关推荐

  1. 聊聊Java中的并发队列中 有界队列和无界队列的区别

    转载自 https://blog.csdn.net/AJ1101/article/details/81711812 本文主要总体的说一说各种并发队列  首先来一张全体照  从有界无界上分  常见的有界 ...

  2. Java并发包--阻塞队列(BlockingQueue)

    阻塞队列介绍 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全"传输"数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质 ...

  3. java并发包消息队列

    消息队列常用于有生产者和消费者两类角色的多线程同步场景 BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具. 主要的方法是:put.take一对阻塞存 ...

  4. Java多线程及并发

    进程:它是内存中的一段独立的空间. 线程:位于进程中,负责当前进程中的某个具备独立运行资格的空间. 进程是负责整个程序的运行,而线程是程序中具体的某个独立功能的运行.一个进程中至少应该有一个线程. 多 ...

  5. java 高并发第三阶段实战_Java 高并发第三阶段实战---Java并发包深入解析与使用详解...

    第三阶段的课程主要围绕着Java并发包的使用,展开详细的介绍,主要内容有1.原子包源码剖析,2.并发包工具类详细介绍,3.线程服务以及Future和callable等详细介绍,4.高并发容器和阻塞容器 ...

  6. 并发编程入门(五):Java并发包和Java8并发

    目录 前言 JUC(Java.util.concurrent) 1.Java并发包之原子类 1.1.AtomicInteger 1.2.AtomicReference 1.3.AtomicStampe ...

  7. Java 高并发第三阶段实战---Java并发包深入解析与使用详解

    第三阶段的课程主要围绕着Java并发包的使用,展开详细的介绍,主要内容有1.原子包源码剖析,2.并发包工具类详细介绍,3.线程服务以及Future和callable等详细介绍,4.高并发容器和阻塞容器 ...

  8. 解读 Java 并发队列 BlockingQueue

    最近得空,想写篇文章好好说说 java 线程池问题,我相信很多人都一知半解的,包括我自己在仔仔细细看源码之前,也有许多的不解,甚至有些地方我一直都没有理解到位. 说到线程池实现,那么就不得不涉及到各种 ...

  9. Java并发包中那些值得学习的并发工具类(空谈误国,实干兴邦,代码示范,抛砖引玉)

    首先我们通常说的并发包就是java.util.concurrent包及其子包.集中了Java并发的各种基础工具类. 一.这个并发包在哪 上面的包就是传说中的并发包. 为什么这个并发包就比较流弊呢? 原 ...

  10. Java并发编程初级-未使用Java并发包的时候

    转自Java并发编程网   http://ifeve.com/java_multi_thread_programming_1_2/ 本文介绍了Java原生的多线程技术(1.2),通过详细介绍wait和 ...

最新文章

  1. spring mvc mysql配置_spring mvc配置数据库连接
  2. python是不是特别垃圾-【转】python是垃圾吗?
  3. 【Flask】ORM高级操作之分组、过滤和子查询
  4. Pearson相关系数
  5. 机器视觉和Tesseract
  6. python 时间日期处理
  7. 【NOIp模拟】【二分答案】电缆老板
  8. ajax中get请求获取数据
  9. 关闭tensorflow运行时的警告信息1
  10. 【CSAPP笔记】14. 异常控制流和进程
  11. Select, Supplement and Focus for RGB-D Saliency Detection CVPR2020 卢湖川团队
  12. html手写笔记照片,html手写代码学习笔记
  13. html图片文字下方,css图片下边怎么加字
  14. 百度地图JS API 支持HTTPS
  15. blender关于怎么导出上完色的FBX格式模型、以及导出后再导入,材质预览和渲染模式下材质透明度混乱的解决办法。
  16. 软件测试工程师简历项目经验怎么写?--1000个已成功入职的软件测试工程师简历范文模板(真实简历)
  17. C语言学习经典书籍推荐
  18. 华为鸿蒙,告别 PPT,代码全部开源!
  19. 一:FPGA从入门倒入坟-第一个基础实例蜂鸣器
  20. PC软件问题【微信多开】【Beyond Compare 4 试用期过的解决办法】【搜狗输入法配置时间输入格式】【win10设置登录界面名称】[Syncovery忽略选项][电脑共享配置登陆密码]

热门文章

  1. python滚动条翻页爬取数据_scrapy实践之翻页爬取的实现
  2. button执行onclick函数_JavaScript 函数定义与调用
  3. linux各个目录作用详解,linux各个目录作用
  4. BACKPROPAGATION 手工求解
  5. 温习下 function pointer.
  6. TCP SYN-Cookie背后的人和事
  7. 内核sk_buff工作线程总结
  8. 浅谈c++纯虚函数的多态与数据隐藏
  9. C++ 在.h文件中包含头文件和在.cpp文件中包含头文件有什么区别?
  10. 外部PLC触发VisionMaster多流程运行PLC部分特殊说明