【JavaSE】Java基础语法(三十八):并发工具类

news2024/11/19 8:36:50

文章目录

  • 1. Hashtable
  • 2. ConcurrentHashMap基本使用
  • 3. ConcurrentHashMap1.7原理
  • 4. ConcurrentHashMap1.8原理
  • 5. CountDownLatch
  • 6. Semaphore


在这里插入图片描述

1. Hashtable

Hashtable出现的原因 : 在集合类中HashMap是比较常用的集合对象,但是HashMap是线程不安全的(多线程环境下可能会存在问题)。为了保证数据的安全性我们可以使用Hashtable,但是Hashtable的效率低下。

==代码实现 ==:

import java.util.HashMap;
import java.util.Hashtable;
public class MyHashtableDemo {
	public static void main(String[] args) throws InterruptedException {
		Hashtable<String, String> hm = new Hashtable<>();
		Thread t1 = new Thread(() -> {
			for (int i = 0; i < 25; i++) {
				hm.put(i + "", i + "");
			}
		});
		
		Thread t2 = new Thread(() -> {
			for (int i = 25; i < 51; i++) {
				hm.put(i + "", i + "");
			}
		});
		t1.start();
		t2.start();
		System.out.println("----------------------------");
		
		//为了t1和t2能把数据全部添加完毕
		Thread.sleep(1000);
		//0-0 1-1 ..... 50- 50
		for (int i = 0; i < 51; i++) {
			System.out.println(hm.get(i + ""));
		}//0 1 2 3 .... 50
	}
}

2. ConcurrentHashMap基本使用

ConcurrentHashMap出现的原因 : 在集合类中HashMap是比较常用的集合对象,但是HashMap是线程不安全的(多线程环境下可能会存在问题)。为了保证数据的安全性我们可以使用Hashtable,但是Hashtable的效率低下。

基于以上两个原因我们可以使用JDK1.5以后所提供的ConcurrentHashMap。

  • 体系结构 :
    在这里插入图片描述

  • 总结 :
    1 ,HashMap是线程不安全的。多线程环境下会有数据安全问题
    2 ,Hashtable是线程安全的,但是会将整张表锁起来,效率低下
    3,ConcurrentHashMap也是线程安全的,效率较高。 在JDK7和JDK8中,底层原理不一样。

  • 代码实现

    import java.util.Hashtable;
    import java.util.concurrent.ConcurrentHashMap;
    
    public class MyConcurrentHashMapDemo {
    	public static void main(String[] args) throws InterruptedException {
    		ConcurrentHashMap<String, String> hm = new ConcurrentHashMap<>(100);
    			Thread t1 = new Thread(() -> {
    			for (int i = 0; i < 25; i++) {
    				hm.put(i + "", i + "");
    			}
    		});
    		
    		Thread t2 = new Thread(() -> {
    			for (int i = 25; i < 51; i++) {
    				hm.put(i + "", i + "");
    			}
    		});
    		t1.start();
    		t2.start();
    		System.out.println("----------------------------");
    		
    		//为了t1和t2能把数据全部添加完毕
    		Thread.sleep(1000);
    		//0-0 1-1 ..... 50- 50
    		for (int i = 0; i < 51; i++) {
    			System.out.println(hm.get(i + ""));
    		}//0 1 2 3 .... 50
    	}
    }
    

3. ConcurrentHashMap1.7原理

在这里插入图片描述


4. ConcurrentHashMap1.8原理

在这里插入图片描述

总结 :
1,如果使用空参构造创建ConcurrentHashMap对象,则什么事情都不做。 在第一次添加元素的
时候创建哈希表
2,计算当前元素应存入的索引。
3,如果该索引位置为null,则利用cas算法,将本结点添加到数组中。
4,如果该索引位置不为null,则利用volatile关键字获得当前位置最新的结点地址,挂在他下面,变
成链表。
5,当链表的长度大于等于8时,自动转换成红黑树6,以链表或者红黑树头结点为锁对象,配合悲观
锁保证多线程操作集合时数据的安全性。


5. CountDownLatch

  • CountDownLatch类 :

在这里插入图片描述

  • 使用场景

    让某一条线程等待其他线程执行完毕之后再执行

  • 代码实现

    import java.util.concurrent.CountDownLatch;
    public class ChileThread1 extends Thread {
    	private CountDownLatch countDownLatch;
    	public ChileThread1(CountDownLatch countDownLatch) {
    		this.countDownLatch = countDownLatch;
    	}
    	
    	@Override
    	public void run() {
    		//1.吃饺子
    		for (int i = 1; i <= 10; i++) {
    			System.out.println(getName() + "在吃第" + i + "个饺子");
    		}
    		//2.吃完说一声
    		//每一次countDown方法的时候,就让计数器-1
    		countDownLatch.countDown();
    	}
    }
    
    import java.util.concurrent.CountDownLatch;
    public class ChileThread2 extends Thread {
    	private CountDownLatch countDownLatch;
    	public ChileThread2(CountDownLatch countDownLatch) {
    		this.countDownLatch = countDownLatch;
    	}
    	
    	@Override
    	public void run() {
    		//1.吃饺子
    		for (int i = 1; i <= 15; i++) {
    			System.out.println(getName() + "在吃第" + i + "个饺子");
    		}
    		
    		//2.吃完说一声
    		//每一次countDown方法的时候,就让计数器-1
    		countDownLatch.countDown();
    	}
    }
    
    import java.util.concurrent.CountDownLatch;
    public class ChileThread3 extends Thread {
    	private CountDownLatch countDownLatch;
    	public ChileThread3(CountDownLatch countDownLatch) {
    		this.countDownLatch = countDownLatch;
    	}
    	
    	@Override
    	public void run() {
    		//1.吃饺子
    		for (int i = 1; i <= 20; i++) {
    			System.out.println(getName() + "在吃第" + i + "个饺子");
    		}
    		
    		//2.吃完说一声
    		//每一次countDown方法的时候,就让计数器-1
    		countDownLatch.countDown();
    	}
    }
    
    import java.util.concurrent.CountDownLatch;
    public class MotherThread extends Thread {
    	private CountDownLatch countDownLatch;
    	public MotherThread(CountDownLatch countDownLatch) {
    		this.countDownLatch = countDownLatch;
    	}
    	
    	@Override
    	public void run() {
    		//1.等待
    			try {
    			//当计数器变成0的时候,会自动唤醒这里等待的线程。
    			countDownLatch.await();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		//2.收拾碗筷
    		System.out.println("妈妈在收拾碗筷");
    	}
    }
    
    import java.util.concurrent.CountDownLatch;
    public class MyCountDownLatchDemo {
    	public static void main(String[] args) {
    		//1.创建CountDownLatch的对象,需要传递给四个线程。
    		//在底层就定义了一个计数器,此时计数器的值就是3
    		CountDownLatch countDownLatch = new CountDownLatch(3);
    		//2.创建四个线程对象并开启他们。
    		MotherThread motherThread = new MotherThread(countDownLatch);
    		motherThread.start();
    		ChileThread1 t1 = new ChileThread1(countDownLatch);
    		t1.setName("小明");
    		ChileThread2 t2 = new ChileThread2(countDownLatch);
    		t2.setName("小红");
    		ChileThread3 t3 = new ChileThread3(countDownLatch);
    		t3.setName("小刚");
    		t1.start();
    		t2.start();
    		t3.start();
    	}
    }
    
  • 总结 :

    1. CountDownLatch(int count):参数写等待线程的数量。并定义了一个计数器。
    2. await():让线程等待,当计数器为0时,会唤醒等待的线程
    3. countDown(): 线程执行完毕时调用,会将计数器-1。

6. Semaphore

  • 使用场景 :
    可以控制访问特定资源的线程数量。

  • 实现步骤 :
    1,需要有人管理这个通道
    2,当有车进来了,发通行许可证
    3,当车出去了,收回通行许可证
    4,如果通行许可证发完了,那么其他车辆只能等着

  • 代码实现 :

    import java.util.concurrent.Semaphore;
    public class MyRunnable implements Runnable {
    	//1.获得管理员对象,
    	private Semaphore semaphore = new Semaphore(2);
    	@Override
    	public void run() {
    		//2.获得通行证
    		try {
    			semaphore.acquire();
    			//3.开始行驶
    			System.out.println("获得了通行证开始行驶");
    			Thread.sleep(2000);
    			System.out.println("归还通行证");
    			//4.归还通行证
    			semaphore.release();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    }
    
    public class MySemaphoreDemo {
    	public static void main(String[] args) {
    	MyRunnable mr = new MyRunnable();
    	for (int i = 0; i < 100; i++) {
    		new Thread(mr).start();
    	}
    	}
    }
    

在这里插入图片描述

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

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

相关文章

chatgpt赋能python:Python中的乘方计算:介绍和应用

Python中的乘方计算&#xff1a;介绍和应用 乘方是数学运算中的重要部分&#xff0c;表示一个数&#xff08;称为底数&#xff09;被另一个数&#xff08;称为指数&#xff09;乘以若干次。在Python编程中&#xff0c;乘方运算也是非常常见的。本文将为您介绍Python中的乘方计…

读数据压缩入门笔记03_VLC

1. 概率、熵与码字长度 1.1. 数据压缩的目的 1.1.1. 给定一个数据集中的符号&#xff0c;将最短的编码分配给最可能出现的符号 1.2 1.2.1. 当P(A)P(B)&#xff0c;也就是两个符号等可能出现时&#xff0c;数据集对应的熵取最大值LOG2&#xff08;符号的个数&#xff09;&…

设计模式之~组合模式

组合模式&#xff1a; 将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 结构图&#xff1a; 实例&#xff1a; 透明方式&#xff1a; leaf中也有add和remove叫做透明方式&#xff0c;在component中声明所有用来管…

数组及详解冒泡排序

数组及详解冒泡排序 一维数组的创建和初始化一维数组的创建一维数组的初始化一维数组的应用一维数组在内存中的存储 二维数组的创建和初始化二维数组的创建二维数组的初始化二维数组的应用二维数组在内存中的存储 数组越界问题数组作为函数参数数组名的含义及特殊两个例子 冒泡…

PACS影像解决方案

现代医学影像技术的迅猛发展&#xff0c;使得PACS系统已逐渐成为各级医院实现信息化建设的重要组成部分。医学影像技术的进步也提升了医学影像的清晰度&#xff0c;推动二维PACS向三维升级转变。这一切都使得医学影像数据量激增&#xff0c;加之医疗行业法规的数据保存要求&…

对DataFrame指定字段进行整数编码df[‘字段名称‘].factorize()[0]

【小白从小学Python、C、Java】 【等级考试500强双证书考研】 【Python-数据分析】 对DataFrame指定字段进行整数编码 df[字段名称].factorize()[0] 选择题 关于以下代码说法错误的是&#xff1a; import pandas as pd myData pd.DataFrame({编码前: [A, B, C, A, B]}) …

Missing-Semester Lec1 Solution

操作系统&#xff1a; m a c O S M o n t e r e y v e r s i o n 12.6 macOS \ Monterey version \ 12.6 macOS Montereyversion 12.6 1、查看shell是否符合要求 echo $SHELL /bin/zsh2、在/tmp下新建一个名为missing的文件夹 mkdir missing3、用man查看程序touch的使用手册…

我要官宣了!

小伙伴们大家好&#xff0c;我是阿秀。 我做写文章已经两年多时间了&#xff0c;最开始是分享自己的读研时生活的的小事&#xff0c;后来慢慢记录自己的学习和秋招找工作。 在研三那年校招结束后&#xff0c;我开始系统的分享自己的学习过程&#xff0c;分享自己学习过程中所记…

国产数据库|GBase 8s V8.8 学习笔记之架构介绍

作者 | JiekeXu 来源 |公众号 JiekeXu DBA之路&#xff08;ID: JiekeXu_IT&#xff09; 如需转载请联系授权 | (个人微信 ID&#xff1a;JiekeXu_DBA) 大家好&#xff0c;我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看国产数据库|GBase 8s V8.8 学习笔记之架构介绍&…

《计算机组成原理》唐朔飞 第10章 控制单元的设计 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习计算机组成原理时的个人笔记&#xff0c;分享出来与大家学习交流。使用教材为唐朔飞第3版&#xff0c;笔记目录大体与教材相同。 网课 计算机组成原理&#xff08;哈工大刘宏伟&#xff09;135讲&#xff08;全&#xff09;高清_…

Office project 2021安装

哈喽&#xff0c;大家好。今天一起学习的是project 2021的安装&#xff0c;Microsoft Office project项目管理工具软件&#xff0c;凝集了许多成熟的项目管理现代理论和方法&#xff0c;可以帮助项目管理者实现时间、资源、成本计划、控制。有兴趣的小伙伴也可以来一起试试手。…

Spring事务与事务传播

文章目录 一、什么是事务?二、Spring事务实现编程式事务声明式事务 三、Transactional的使用参数作用Spring事务的隔离级别事务失效的场景Transactional工作原理 四、Spring事务传播机制Spring有哪些事务传播机制&#xff1f; 一、什么是事务? 事务&#xff1a;事务是一组操…

Python十类常见异常类型(附捕获以及异常处理方式)

目录 前言十类异常1.TypeError2.ValueError3.NameError4.IndexError5.KeyError6.ZeroDivisionError7.IOError8.ImportError9.AttributeError10.KeyboardInterrupt 异常捕获以及处理总结 前言 大家好&#xff0c;我是辣条哥&#xff01;今天给大家讲讲我们刚开始写代码是都会出现…

系统学习】Java基础3之反射

Java反射 反射机制概述 Reflection&#xff08;反射&#xff09;是被视为动态语言的关键&#xff0c;反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息&#xff0c;并能直接操作任意对象的内 部属性及方法 加载完类之后&#xff0c;在堆内存的方法区中就产…

美债提高上限的后果

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在小号“刘教链Pro”发表了一篇《再论以太坊的自限性》&#xff0c;谈了一下对比特币和以太坊自限性问题的再研讨&#xff0c;欢迎关注“刘教链Pro”并阅读。 * * * 隔夜比特币小幅回落至28k下方。昨日在28k上方遭遇了…

在Centos Stream 9上Docker的实操教程(四) - Docker腾讯云远程仓库和本地私有仓库

在Centos Stream 9上Docker的实操教程 - Docker腾讯云远程仓库和本地私有仓库 本地镜像发布到腾讯云注册开通腾讯云初始化个人版服务创建仓库推送拉取镜像 私有仓库结语 本地镜像发布到腾讯云 由于官方的docker hub访问由于网络原因&#xff0c;可能会比较慢&#xff0c;博主推…

0301依赖使用以及配置优先级-基础-springboot2.7.x系列

文章目录 1 依赖方式1.1 spring-boot-starter-parent依赖1.2 spring-boot-dependencies依赖1.3 对比 2 使用方式2.1 SpringbootApplication2.2 高度定制 3 springboot各种配置优先级顺序4 sprinboot配置文件解析顺序结语 1 依赖方式 这里项目以开源的renren和pig为例&#xff…

Meta发布Megabyte AI模型抗衡Transformer

&#x1f680; Meta发布Megabyte AI模型抗衡Transformer&#xff1a;解决后者已知问题、速度提升4成 摘要&#xff1a;Meta团队开发的Megabyte AI模型可以抗衡当前在自然语言处理领域非常流行的Transformer模型&#xff0c; 解决了Transformer模型所面临的训练速度较慢、难以…

【Java 并发编程】深入理解 AQS - AbstractQueuedSynchronizer

深入理解 AQS - AbstractQueuedSynchronizer 1. AQS1.1 什么是 AQS1.2 AQS 具备的特性 2. AQS 原理解析2.1 AQS 原理概述2.1.1 什么是 CLH 锁2.1.2 AQS 中的队列 2.2 AQS 共享资源的方式&#xff1a;独占式和共享式2.2.1 Exclusive&#xff08;独占式&#xff09;2.2.2 Share&a…

用 GPT-4 来面试,简直开挂啊!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 众所周知&#xff0c;ChatGPT 凭其超强的文本生成能力&#xff0c;成为了 2023 年最为火爆的 AI 应用之一。 几个月前&#xff0c;GPT-4 发布&#xff0c;又将 ChatGPT 的能力提升到了一个…