并发工具类【线程安全相关的类】

1.Hashtable和ConcurrentHashMap

Hashtable:哈希表结构(数组+链表),线程安全的(同步代码块,效率低)
ConcurrentHashMap:
jdk7:采用Segment数组[不会扩容] + HashEntry[二次哈希计算存入的位置,可扩容],线程安全(synchronized)
jdk8:哈希表结构(数组+链表+红黑树),线程安全的(synchronized+CAS算法,效率高)
【注:使用线程不安全的类可能会出现赋值为null的情况】

public class Demo3 {public static void main(String[] args) throws InterruptedException {//Hashtable<String, String> hsTable = new Hashtable<>();ConcurrentHashMap<String, String> concurrentHashMap = new ConcurrentHashMap<>();Thread thread1 = new Thread(() -> {for (int i = 0; i < 25; i++) {concurrentHashMap.put(i + "", i + "");}});Thread thread2 = new Thread(() -> {for (int i = 25; i < 51; i++) {concurrentHashMap.put(i + "", i + "");}});thread1.start();thread2.start();System.out.println("--------------------");//为了两条线程的数据都添加完毕Thread.sleep(1000);//打印集合的所有值for (int i = 0; i < 51; i++) {System.out.println(concurrentHashMap.get(i + ""));}}
}打印结果:
--------------------------------------------------------------------------------------
0
......
49
50
2.CountDownLatch

孩子吃完饺子,妈妈收拾碗筷【使用场景:当需要某一个线程在其他线程执行完毕之后才执行】
原理:创建CountDownLatch的对象,参数为等待线程的数量, 并定义了一个计数器,初始值为参数的值

//CountDownLatch 并发工具类
public class Demo {public static void main(String[] args) {//创建CountDownLatch的对象,参数为等待线程的数量//并定义了一个计数器,初始值为参数的值【参数为多少则几条线程结束后才执行】CountDownLatch countDownLatch = new CountDownLatch(1);//countDownLatch传递到4个线程时,它们则共用一个计数器MotherThread motherThread = new MotherThread(countDownLatch,"妈妈---");ChildThread1 childThread1 = new ChildThread1(countDownLatch,"小刚---");//ChildThread2 childThread2 = new ChildThread2(countDownLatch,"小明---");//ChildThread3 childThread3 = new ChildThread3(countDownLatch,"小红---");motherThread.start();childThread1.start();//childThread2.start();//childThread3.start();}
}//ChildThread1 孩子1线程,同理其他孩子线程与之一致,可复制添加
public class ChildThread1 extends Thread {private CountDownLatch countDownLatch;public ChildThread1(CountDownLatch countDownLatch, String s) {this.countDownLatch = countDownLatch;this.setName(s);}@Overridepublic void run() {//1.吃饺子for (int i = 1; i <= 3; i++) {System.out.println(Thread.currentThread().getName() + "在吃" + i + "个饺子");}//2.吃完说一声//每一次countDown方法后,count--;countDownLatch.countDown();}
}//妈妈线程
public class MotherThread extends Thread{private CountDownLatch countDownLatch;public MotherThread(CountDownLatch countDownLatch, String s) {this.countDownLatch=countDownLatch;}@Overridepublic void run() {try {//1.等待//当计数器变为0时,会自动唤醒等待的线程countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}//2.收拾碗筷System.out.println("妈妈正在收拾碗筷");}
}打印结果:
--------------------------------------------------------------------------------------
小刚---在吃1个饺子
小刚---在吃2个饺子
小刚---在吃3个饺子
妈妈正在收拾碗筷
3.Semaphore管理员对象

用来控制正在执行的线程数量

//Semaphore管理员对象【用来控制正在执行的线程数量】
public class Demo1 {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();//开启100条线程for (int i = 0; i < 4; i++) {new Thread(myRunnable).start();}}
}//具体实现类
public class MyRunnable implements Runnable {//1.创建Semaphore对象,参数为通行证数量Semaphore semaphore =new Semaphore(2);@Overridepublic void run() {try {//2.获得通行证semaphore.acquire();//3.开始行驶System.out.println("获得了通行证开始通行");//4.归还通行证System.out.println("归还通信证");semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}}
}打印结果:
--------------------------------------------------------------------------------------
获得了通行证开始通行
归还通信证
获得了通行证开始通行
归还通信证
获得了通行证开始通行
归还通信证
获得了通行证开始通行
归还通信证
4.其他线程安全类

StringBuilder和StringBuffer
StringBuilder: 线程不安全的(效率高)
StringBuffer: 线程安全的(效率低)
安全的原因是因为其内部方法都有锁
ArrayList和Vector
ArrayList: 数组结构,线程不安全(效率高)
Vector: 数组结构,线程安全的(效率低)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JSON Web Token (JWT)生成Token及解密实战

转载自 JSON Web Token (JWT)生成Token及解密实战昨天讲解了JWT的介绍、应用场景、优点及注意事项等&#xff0c;今天来个JWT具体的使用实践吧。从JWT官网支持的类库来看&#xff0c;jjwt是Java支持的算法中最全的&#xff0c;推荐使用&#xff0c;网址如下。https://github.co…

java中两个map的融合(两个map有相同字段)

试想这样一个场景&#xff1a; 数据库表中 有 城市信息表 city_tbl&#xff1b; 有院士信息表 ys_tbl &#xff0c;其中院士有城市id字段&#xff08;id&#xff09;&#xff1b; 但是不是所有城市都有院士&#xff1b; 我们想要得到 城市的详细信息&#xff0c;包括院士个数…

网络编程实现

1.网络编程三要素 1.IP地址&#xff1a;网络中设备的唯一标识IPv4: 由4个字节组成&#xff0c;点分十进制表示法IPv6: 由16个字节组成&#xff0c;冒分十六进制表示法"127.0.0.1"本地主机网络地址【用于测试】相关命令&#xff1a;ipconfig: 查看本机在当前网络环境…

通用唯一标识码UUID的介绍及使用

转载自 通用唯一标识码UUID的介绍及使用。什么是UUID&#xff1f; UUID全称&#xff1a;Universally Unique Identifier&#xff0c;即通用唯一识别码。 UUID是由一组32位数的16进制数字所构成&#xff0c;是故UUID理论上的总数为16^32 2^128&#xff0c;约等于3.4 x 10^38。也…

IEEE论文检测的字体未嵌入问题Times New Roman,Bold, Times New Roman,Italic is not embedded解决方法

【1】README 毕业前写了一篇 英文paper&#xff0c; 接受后&#xff0c;需要提交到 IEEE PDF Express 做格式检测&#xff1b;&#xff1b;latex源码中引用了 Visio生成的算法流程图&#xff0c;PDF文件&#xff1b; 谁料&#xff0c;哥子提交上去后&#xff0c;报如下错误&…

类加载器的创建

1.什么是类加载器 <1>概念&#xff1a;类加载器是用来加载类的工具(从硬盘加载到JVM内存) <2>类加载器的加载时机【类在使用时才被加载&#xff0c;不使用不加载】 a.创建类的对象时 b.通过类名调用静态方法时 c.通过反射加载类 <3>3.类加载器的分类 a.启动…

Java 必看的 Spring 知识汇总

转载自 Java 必看的 Spring 知识汇总Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而&#xff0c;Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性的角度而言&#xff0c;绝大部分Java应用…

Java 截取反斜杠--java使用split拆分特殊字符

orgn link : http://blog.csdn.net/scy411082514/article/details/7987852 Java 截取反斜杠 replaceAll和split &#xff08;“\”&#xff09; 问题解决办法 2009年07月15日 星期三 上午 11:26 xxx.split("\\") 显然得不到想要的结果 正确方法 xxx.split(&qu…

反射的实现

1.获取类的字节码对象 //获取类的字节码对象 public class Demo1 {public static void main(String[] args) throws ClassNotFoundException {//方式1&#xff1a;类名.ClassClass<?> clazz1 Student.class;//方式2&#xff1a;对象名.getClass()Student student new…

thinking-in-java(11) 持有对象

【11.1】泛型和类型安全的容器 &#xff08;1&#xff09;ArrayList<Apple> 中尖括号括起来的是&#xff1a; 类型参数&#xff0c;它指定了这个容器实例可以保存的类型&#xff1b; 【荔枝&#xff1a;有泛型和没有泛型的区别】 class Apple {private static long coun…

JDK9新特性实战:简化流关闭新姿势

转载自 JDK9新特性实战&#xff1a;简化流关闭新姿势。做Java开发的都知道&#xff0c;每个资源的打开都需要对应的关闭操作&#xff0c;不然就会使资源一直占用而造成资源浪费&#xff0c;从而降低系统性能。 关于资源的关闭操作&#xff0c;从JDK7-JDK9有了不少的提升及简化。…

XML配置文件

XML的语法 1.xml是由自定义的标签组成 <开始标签>标签体</结束标签> <自闭合标签/> 2.xml文件的语法 1)必须要有一个文档声明 <?xml version"1.0" encoding"UTF-8" ?>2)只有一个根标签3)特殊字符 如< > & 必须使用…

DevExperience(1710)

【1】Date 和 String 互转 // Date 和 String 互转。public static void main(String[] args) {SimpleDateFormat formatter new SimpleDateFormat("yyyyMMdd");// Date 转 StringString curDateStr formatter.format(new Date());System.out.println("curDat…

Java Jar包的压缩、解压使用指南

转载自 Java Jar包的压缩、解压使用指南什么是jar包 JAR&#xff08;Java Archive&#xff09;是Java的归档文件&#xff0c;它是一种与平台无关的文件格式&#xff0c;它允许将许多文件组合成一个压缩文件。 如何打/解包 使用jdk/bin/jar.exe工具&#xff0c;配置完环境变量后…

枚举的实现

1.枚举的概念 枚举就是把几个固定的常量列举出来。枚举本质上也是一个类&#xff0c;只不过这个类的对象是几个固定的值&#xff0c;不能让外界创建对象【因为其内部的构造方法私有】 2.定义一个枚举类 public enum Week {//枚举项表示Week类的对象&#xff0c;带括号表示使…

think-in-java(17)容器深入研究

注意&#xff1a; 17章接着 11章继续分析 java容器&#xff0c; think-in-java(11) 【17.1】完整的容器分类方法 【容器分类网络解说】 1&#xff09;接口&#xff1a;虚线框&#xff0c;没有实线入边&#xff08;没有实体类继承关系&#xff0c;只有接口继承关系&#xff09…

浅析负载均衡的6种算法,Ngnix的5种算法

转载自 浅析负载均衡的6种算法&#xff0c;Ngnix的5种算法。 常见的几种负载均衡算法 1、轮询法 将请求按顺序轮流地分配到后端服务器上&#xff0c;它均衡地对待后端的每一台服务器&#xff0c;而不关心服务器实际的连接数和当前的系统负载。 2、随机法 通过系统的随机算法…

注解的实现

1.概念 注解表示一个标识(标注、标记)&#xff0c;它可以用在类上、方法上、变量上等&#xff0c;给类的各个组成部分一些额外的表示&#xff0c;能够被编译器识别。 2.常见注解 Override: 描述一个方法是复写的父类方法 Deprecate: 描述一个方法是过时的方法&#xff0c;调…

Java对象引用四个级别(强、软、弱、虚)

转载自 Java对象引用四个级别&#xff08;强、软、弱、虚&#xff09; 最近&#xff0c;高级Java技术栈微信群中&#xff0c;有一些猿友在讨论JVM中对象的周期问题&#xff0c;有谈到引用的级别&#xff0c;现在为大家做个总结吧&#xff0c;虽然大多数公司并没有意识或者用到这…

反射和配置文件的实际应用

1.利用反射完成不同参数赋值 <1>无参构造[默认赋值] Student 和 Teacher皆为JavaBean类 public class Demo1 {public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {//…