java并发包下有很多内置的处理线程安全问题工具类,在集合中就有2种线程同步的类,比如:Vector较ArrayList线程安全,但是效率较低,同样的还有Hashtable和HashMap,在实际项目中常用ArrayList与HashMap,因为前者比重,影响执行效率

  • 以下是java的几种并发包下的使用场景

1.CountDownLatch

CountDownLatch 同步器

1.1 原理:

  • 运行多个或一个线程,等待其他多个或一个线程执行完毕,在执行当前线程
  • java并发包下同步辅助类:定义计数器可以设定个数,每次调用countDown() 计数器中的个数就会减1,当计数器的个数等于0的时候,调用await方法时,就会执行await方法后面的代码,如果计数器个数大于0时,调用await时,是不会执行await后面的代码

1.2 使用场景:

  • 有一个文件,需要2个线程执行读写操作,执行完写的操作才可以读取内容
    实现:使用计数器CountDownLatch,计数器的个数为2,在每个写的线程执行完毕,调用countDown方法,在写的线程后面,调用计数器的await方法,await方法后面执行读线程,这样在读取数据时,可以保证数据的完整性
public class ThreadWrite implements Runnable {private Poeple peo;private Integer count;private CountDownLatch cdl;public ThreadWrite(Poeple peo, Integer count,CountDownLatch cdl) {this.peo = peo;this.count = count;this.cdl = cdl;}@Overridepublic void run() {System.out.println("ThreadWrite");if (count == 0) {peo.setName("小明");peo.setSex("男");} else if (count == 1) {peo.setName("小红");peo.setSex("女");}cdl.countDown();//每次执行同步器减一}
}public static void main(String[] args) {Poeple peo = new Poeple();CountDownLatch cdl = new CountDownLatch(2);//创建同步器,线程个数为2new Thread(new ThreadWrite(peo, 1, cdl)).start();new Thread(new ThreadWrite(peo, 1, cdl)).start();try {cdl.await();//等待同步器个数为0,执行后续代码new Thread(new ThreadRead(peo)).start();} catch (InterruptedException e) {e.printStackTrace();}
}

2. CyclicBarrier

CyclicBarrier 循环屏障

2.1 原理:

  • 运行多个线程之间相互等待,执行完毕后在执行线程中await后面的代码

2.2 使用场景:

  • 多个线程在执行计算操作,另一个线程需要将计算结果相加,创建一个屏障线程,等待其他线程执行后在执行屏障线程
  • 多个线程中有需要全部执行完,最后执行的代码
/*** 写线程*/
public class ThreadWrite implements Runnable {private Poeple peo;private Integer count;private CyclicBarrier cb;public ThreadWrite(Poeple peo, Integer count, CyclicBarrier cb) {this.peo = peo;this.count = count;this.cb = cb;}@Overridepublic void run() {System.out.println("ThreadWrite");/*循环屏障*/try {cb.await();//等待线程数等于,CyclicBarrier中parties个数,执行之前所有等待线程await后面的代码System.out.println("循环屏障");} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}
}/*** 读取线程*/
public class ThreadRead implements Runnable {private Poeple peo;public ThreadRead(Poeple peo) {this.peo = peo;}@Overridepublic void run() {synchronized (peo) {System.out.println("ThreadRead");System.out.println(peo.getName());System.out.println(peo.getSex());}}
}public static void main(String[] args) {CyclicBarrier cb = new CyclicBarrier(4);//循环屏障System.out.println("当前线程数"+cb.getParties());System.out.println("当前线程等待数"+cb.getNumberWaiting());Poeple peo = new Poeple();int count = 0;new Thread(new ThreadWrite(peo, count,cb)).start();new Thread(new ThreadWrite(peo, count,cb)).start();new Thread(new ThreadWrite(peo, count,cb)).start();new Thread(new ThreadWrite(peo, count,cb)).start();
}

3. Semaphore

Semaphore:信号量

3.1 原理:

  • java并发包下,可以处理一个及以上的线程的并发量

3.2 使用场景:

  • 一个楼层,有2个入口,一个入口每次只能进1个人,每次可以进2个人,而使用synchronized,只有一个入口,每次只能进1个人,使用信号量可以提高处理并发的个数
public class ThreadWrite implements Runnable {private Poeple peo;private Integer count;private Semaphore s;private List<Poeple> peoList;public ThreadWrite(List<Poeple> peoList, Integer count, Semaphore s) {this.peoList = peoList;this.count = count;this.s = s;}@Overridepublic void run() {/*信号量*/try {s.acquire();//获取锁System.out.println("ThreadWrite");Poeple poeple = new Poeple();poeple.setName("name1");poeple.setSex("nv");peoList.add(poeple);System.out.println(Thread.currentThread().getName() + "=========>" + peoList.size());s.release();//释放锁} catch (InterruptedException e) {e.printStackTrace();}}
}public static void main(String[] args) {Semaphore s = new Semaphore(3);//信号量 同时处理三个线程List<Poeple> peo = new ArrayList<>();int count = 0;for (int i = 0; i < 20; i++) {new Thread(new ThreadWrite(peo,count,s),"线程1").start();new Thread(new ThreadWrite(peo,count,s),"线程2").start();new Thread(new ThreadWrite(peo,count,s),"线程3").start();}
}
  • 实体类代码
public class Poeple {private Integer id;private String name;private String sex;public Poeple() {}public Poeple(Integer id, String name, String sex) {this.id = id;this.name = name;this.sex = sex;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}
}

java并发包原理及使用场景相关推荐

  1. java 并发包 使用场景_java并发包原理及使用场景

    java并发包下有很多内置的处理线程安全问题工具类,在集合中就有2种线程同步的类,比如:Vector较ArrayList线程安全,但是效率较低,同样的还有Hashtable和HashMap,在实际项目 ...

  2. Java SPI机制原理和使用场景

    SPI的全名为Service Provider Interface.这个是针对厂商或者插件的.一般来说对于未知的实现或者对扩展开放的系统,通常会把一些东西抽象出来,抽象的各个模块,往往有很多不同的实现 ...

  3. java并发包线程池原理分析锁的深度化

    java并发包&线程池原理分析&锁的深度化 并发包 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素 ...

  4. 腾讯面试题Java 并发包之线程池综述

    Java 并发包之线程池综述 ■ 线程池的创建 在Java中,您可以通过调整-Xss参数来调节每个线程栈的大小(64bit系统默认1024KB),当减小该值时意味着可以创建更多的线程数,但问题是JVM ...

  5. 同一事务多次加for_谈谈事务隔离级别,以及悲观锁和乐观锁的原理和应用场景...

    前言 在日常开发中,数据库我想大家一点都不陌生是吧,我想不管你写啥,数据库就算没用过你也听说过吧.做好数据方面的操作,不仅仅需要对Java相关框架的掌握,还需要对数据库自身体系结构的理解. 本文是补充 ...

  6. 深入java并发包源码(三)AQS独占方法源码分析

    深入java并发包源码(一)简介 深入java并发包源码(二)AQS的介绍与使用 深入java并发包源码(三)AQS独占方法源码分析 AQS 的实现原理 学完用 AQS 自定义一个锁以后,我们可以来看 ...

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

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

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

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

  9. java并发包详解(jdk7)

    在此对java并发包做一个大致总结,如有错误,请指正. juc包的总体结构大致如下 外层框架主要有Lock(ReentrantLock.ReadWriteLock等).同步器(semaphores等) ...

  10. mysql 消极锁_MySQL支持的事物隔离级别以及消极锁和乐观锁原理和应用场景

    在一样平常开发中,尤其是营业开发,少不了行使 Java 对数据库举行基本的增删改查等数据操作,这也是Java工程师的必备手艺之一.做好数据操作,不仅仅需要对Java语言相关框架的掌握,更需要对种种数据 ...

最新文章

  1. 利用yum 安装 lamp环境搭载 cacti监控和memcached数据库
  2. 部署SQL AZURE的客户端管理工具,云计算体验之二
  3. 渣渣小本求职复习之路每天一博客系列——TCP/IP协议栈(5)
  4. 030_SpringBoot全局属性配置文件
  5. 三星电子电容器件识别
  6. 《使用云计算和大数据进行性能测试》
  7. 操作系统 : 按优先数调度算法实现处理器调度(C++)
  8. 冒泡排序c java c,冒泡排序,c语言冒泡排序法代码
  9. E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-front
  10. web开发的一些工具技巧_有用的技巧可帮助您建立Web开发人员的良好习惯
  11. 成都Uber优步司机奖励政策(1月28日)
  12. SolrCloud集群的安装使用以及Zookeeper的介绍
  13. 【BZOJ1475】方格取数 [最小割]
  14. Android 项目中丁点经验总结
  15. ubuntu下研华工控机CAN卡驱动的安装与测试
  16. 50道逻辑编程小题目
  17. 告别奇虎360、依图科技,再谋他途!依图CTO颜水成被曝离职!
  18. 如何记录COGI中删除的记录
  19. 智能照明系统雏形(esp8266nodemcu开发板+点灯科技软件+声控模块+光敏模块+人体感应模块)
  20. android逆向知乎,Android逆向之路---为什么从后台切换回app又显示广告了

热门文章

  1. oracle导入多sheet的excel,excel表格数据导入oracle数据库-一个excel表格中有多个sheet,如何将其导入oracle数......
  2. C++中读写文件demo
  3. yagmail发送附件
  4. as本地仓库更改_如何将源仓库的更改同步到fork仓库?
  5. CentOS 6.6上搭建C++运行环境
  6. mid制作乐谱_乐谱编辑(在线简谱制作软件)
  7. 基于Matlab的车牌识别系统(带界面、模板库)
  8. <C语言>数据文件自动生成(多模块进阶)
  9. Java可视化编程【JFormDesigner安装教程】
  10. linux学习之vi编辑器的使用详解