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;

}

@Override

public 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);//创建同步器,线程个数为2

new 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;

}

@Override

public 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;

}

@Override

public 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 peoList;

public ThreadWrite(List peoList, Integer count, Semaphore s) {

this.peoList = peoList;

this.count = count;

this.s = s;

}

@Override

public 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 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 并发包 使用场景_java并发包原理及使用场景相关推荐

  1. Java并发包常见异常_Java并发包1--线程的状态及常用方法

    一.线程主要有以下几种状态: new(新建):线程刚刚被创建 runnable(就绪):新建的线程执行start方法进入就绪状态等待系统调度分配CPU,被分配了之后就进入运行中状态 blocked(阻 ...

  2. java volatile关键字的作用_java volatile关键字作用及使用场景详解

    1. volatile关键字的作用:保证了变量的可见性(visibility).被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象.如以下代码片段,isShut ...

  3. java抠图边框颜色处理_java 实现抠图(项目应用场景:抠图章)

    1.直接看代码,如何抠得不是很完美,修改下色差范围值,直到将底色全部抠掉 import javax.imageio.ImageIO; import javax.swing.*; import java ...

  4. java入参为方法_Java命令注入原理结合Java Instrument技术(FreeBuf首发)

    一.前言 命令注入:恶意用户构造恶意请求,对一些执行系统命令的功能点进行构造注入,从而达到执行命令的效果. 二.演示环境搭建 这里采用springboot+swagger搭建一个模拟的web环境:启动 ...

  5. java 线程池的理解_JAVA线程池原理的理解

    线程池原理基础理解: 线程池初始化规定个数的线程,然后这些线程一直运行,并且监控线程队列,只要线程队列被添加进线程,那么线程池不断从队列中取出线程运行.直到队列中的线程为空.实例代码如下: packa ...

  6. java什么时候用链表_java链表的原理及使用方法

    链表是一种物理存储单元上非连续.非顺序(即每个数据对象data存放的位置可以是非连续.非顺序的)的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 链表中每一个元素称为结点,结点可以在运 ...

  7. java 反射机制详解_java反射机制原理详解

    反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠覆原来对java的理解. J ...

  8. java数据库连接池简单讲解_Java数据库连接池原理机制的详细讲解

    1.根本概念及原理 由上面的剖析能够看出,疑问的本源就在于对数据库衔接资源的低效办理.咱们晓得,关于共享资源,有一个很闻名的描绘方法:资源池 (Resource Pool).该方法正是为了处置资源的频 ...

  9. java面试题(24)ThreadLocal的原理和使用场景

    一篇讲的很好的链接 1.四种引用类型   引用类型分为:强引用.软引用.弱引用.虚引用.   强引用:一般我们使用的都是强引用,特点是不会被gc回收,宁愿抛出内存溢出异常也不会回收:   软引用:特点 ...

最新文章

  1. python二维元组_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
  2. 【SpringMVC 之应用篇】 2_SpringMVC 的传参问题
  3. 3DSlicer3:模块管理(一)颜色、DCM、数据、模型、注释
  4. C++赋值运算符重载
  5. 未来茅台酒会怎样跌下神坛?
  6. 《游戏之旅-我的编程感悟》读书笔记
  7. 如何格式化电脑_内存卡格式化不了怎么办?教你两招
  8. 如何在 Mac 上映射网络驱动器
  9. 格式html载入矢量图片,Web前端矢量小图标的使用方法
  10. QT 矢量绘图和非矢量绘图(一)
  11. 手机CPU性能天梯图及品牌
  12. Linux批量操作------mov转MP4
  13. 怎么把多个pdf文件合并成一个pdf?
  14. 了解App启动时间测试方法
  15. 【Vue】Emitted value instead of an instance of Error
  16. 《前端》eval函数
  17. To install it ,you can run npm i -- save vuetypesumd
  18. 潜心一技、做到极致!——Elastic认证工程师之路
  19. 酒店点菜系统c语言,求一个用最基础的C语言编写的简单饭店点菜系统
  20. 台式机和笔记本属于什么计算机,pc机属于什么型计算机

热门文章

  1. gamma是什么意思以及gray gamma 2.2(1.8)校正
  2. Excel数据录入快捷操作:
  3. 上班路上因单方事故被撞伤可以算是工伤吗
  4. 中学生计算机知识竞赛方案,2017年中学生科普知识竞赛题附答案
  5. 题解:补♂课第110场
  6. 从赋能到实践引领,百余位架构师经验之谈
  7. 手机怎么访问kodi_干货:如何使用KODI打造属于自己的娱乐媒体内容库?
  8. 解决KEEL闪退问题
  9. 天翼云赋能智慧农业 新农人迎来好收成
  10. 结构体 7.公共钥匙盒