java 并发包 使用场景_java并发包原理及使用场景
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并发包原理及使用场景相关推荐
- Java并发包常见异常_Java并发包1--线程的状态及常用方法
一.线程主要有以下几种状态: new(新建):线程刚刚被创建 runnable(就绪):新建的线程执行start方法进入就绪状态等待系统调度分配CPU,被分配了之后就进入运行中状态 blocked(阻 ...
- java volatile关键字的作用_java volatile关键字作用及使用场景详解
1. volatile关键字的作用:保证了变量的可见性(visibility).被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象.如以下代码片段,isShut ...
- java抠图边框颜色处理_java 实现抠图(项目应用场景:抠图章)
1.直接看代码,如何抠得不是很完美,修改下色差范围值,直到将底色全部抠掉 import javax.imageio.ImageIO; import javax.swing.*; import java ...
- java入参为方法_Java命令注入原理结合Java Instrument技术(FreeBuf首发)
一.前言 命令注入:恶意用户构造恶意请求,对一些执行系统命令的功能点进行构造注入,从而达到执行命令的效果. 二.演示环境搭建 这里采用springboot+swagger搭建一个模拟的web环境:启动 ...
- java 线程池的理解_JAVA线程池原理的理解
线程池原理基础理解: 线程池初始化规定个数的线程,然后这些线程一直运行,并且监控线程队列,只要线程队列被添加进线程,那么线程池不断从队列中取出线程运行.直到队列中的线程为空.实例代码如下: packa ...
- java什么时候用链表_java链表的原理及使用方法
链表是一种物理存储单元上非连续.非顺序(即每个数据对象data存放的位置可以是非连续.非顺序的)的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 链表中每一个元素称为结点,结点可以在运 ...
- java 反射机制详解_java反射机制原理详解
反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠覆原来对java的理解. J ...
- java数据库连接池简单讲解_Java数据库连接池原理机制的详细讲解
1.根本概念及原理 由上面的剖析能够看出,疑问的本源就在于对数据库衔接资源的低效办理.咱们晓得,关于共享资源,有一个很闻名的描绘方法:资源池 (Resource Pool).该方法正是为了处置资源的频 ...
- java面试题(24)ThreadLocal的原理和使用场景
一篇讲的很好的链接 1.四种引用类型 引用类型分为:强引用.软引用.弱引用.虚引用. 强引用:一般我们使用的都是强引用,特点是不会被gc回收,宁愿抛出内存溢出异常也不会回收: 软引用:特点 ...
最新文章
- python二维元组_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
- 【SpringMVC 之应用篇】 2_SpringMVC 的传参问题
- 3DSlicer3:模块管理(一)颜色、DCM、数据、模型、注释
- C++赋值运算符重载
- 未来茅台酒会怎样跌下神坛?
- 《游戏之旅-我的编程感悟》读书笔记
- 如何格式化电脑_内存卡格式化不了怎么办?教你两招
- 如何在 Mac 上映射网络驱动器
- 格式html载入矢量图片,Web前端矢量小图标的使用方法
- QT 矢量绘图和非矢量绘图(一)
- 手机CPU性能天梯图及品牌
- Linux批量操作------mov转MP4
- 怎么把多个pdf文件合并成一个pdf?
- 了解App启动时间测试方法
- 【Vue】Emitted value instead of an instance of Error
- 《前端》eval函数
- To install it ,you can run npm i -- save vuetypesumd
- 潜心一技、做到极致!——Elastic认证工程师之路
- 酒店点菜系统c语言,求一个用最基础的C语言编写的简单饭店点菜系统
- 台式机和笔记本属于什么计算机,pc机属于什么型计算机