我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JUC包(java.util.concurrent)下的常用子类

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JUC包(java.util.concurrent)下的常用子类

文章目录


前言

博主个人社区:开发与算法学习社区

博主个人主页:Killing Vibe的博客

欢迎大家加入,一起交流学习~~

一、对象锁juc.locks包

在Java中除了synchronized关键字可以实现对象锁之外,java.util.concurrent中的Lock接口也可以实现对象锁。

在这里插入图片描述

介绍一下这个lock锁的简要实现:

  • JDK1.0就有的,需要JVM借助操作系统提供的mutex系统原语实现

  • JDK1.5之后,Java语言自己实现的互斥锁实现,不需要借助操作系统的monitor机制

注:使用Lock接口需要显式的进行加锁和解锁操作。

我们可以使用Lock接口的实现子类ReentrantLock来进行加锁解锁:

ReentrantLock 可重入互斥锁. 和 synchronized 定位类似, 都是用来实现互斥效果, 保证线程安全.

ReentrantLock 的用法:

  1. lock(): 加锁,获取锁失败的线程进入阻塞状态,直到其他线程释放锁,再次竞争,死等。
  2. trylock(超时时间): 加锁, 获取锁失败的线程进入阻塞态,等待一段时间,时间过了若还未获取到锁恢复执行,放弃加锁,执行其他代码
  3. unlock(): 解锁

synchronized和lock的区别:

  1. synchronized 是Java的关键字, 由 JVM 实现,需要依赖操作系统提供的线程互斥原语(mutex),而Lock标准库的类和接口,其中一个最常用的子类( ReentrantLock ,可重入锁),由Java本身实现的,不需要依赖操作系统

  2. synchronized 隐式的加锁和解锁,lock需要显示进行加锁和解锁

  3. synchronized 在获取锁失败的线程时,死等;lock可以使用trylock等待一段时间之后自动放弃加锁,线程恢复执行在这里插入图片描述

  4. synchronized 是非公平锁, ReentrantLock 默认是非公平锁. 可以通过构造方法传入一个 true 开启公平锁模式. 在这里插入图片描述

  5. synchronized不支持读写锁,Lock子类ReentrantReadWriteLock支持读写锁。在这里插入图片描述

  6. 更强大的唤醒机制. synchronized 是通过 Object 的 wait / notify 实现等待-唤醒. 每次唤醒的是一个随机等待的线程.ReentrantLock搭配 Condition 类实现等待-唤醒, 可以更精确控制唤醒某个指定的线程

小结:

一般场景synchronized足够用了,需要用超时等待锁,公平锁,读写锁再考虑使用juc.lock

如何选择使用哪个锁?

  • 锁竞争不激烈的时候, 使用 synchronized, 效率更高, 自动释放更方便.
  • 锁竞争激烈的时候, 使用 ReentrantLock, 搭配 trylock 更灵活控制加锁的行为, 而不是死等.
  • 如果需要使用公平锁, 使用 ReentrantLock.

二、原子类

原子类内部用的是 CAS 实现,所以性能要比加锁实现 i++ 高很多。原子类有以下几个:

  • AtomicBoolean
  • AtomicInteger
  • AtomicIntegerArray
  • AtomicLong
  • AtomicReference
  • AtomicStampedReference

以 AtomicInteger 举例,常见方法有:

addAndGet(int delta);   i += delta;decrementAndGet(); --i;getAndDecrement(); i--;incrementAndGet(); ++i;getAndIncrement(); i++;

三、四个常用工具类

juc包下一共有四个常用工具类:

  1. 信号量 - Semaphore
  2. 计数器 - CountDownLatch
  3. 循环栅栏 - CyclicBarrier
  4. 两个线程之间的交换器 - Exchanger

3.1 信号量 Semaphore

信号量Semaphore就是一个计数器,表示当前可用资源的个数

关于信号量Semaphore有两个核心操作:

  • P - 申请资源操作
  • V - 释放资源操作

Semaphore 的PV加减操作都是原子性的,再多线程场景下可以直接使用

public static void main(String[] args) {        // 在构造参数传入可用资源的个数        // 可用资源为6个        Semaphore semaphore = new Semaphore(6);        Runnable runnable = new Runnable() {            @Override            public void run() {                try {                    System.out.println(Thread.currentThread().getName() + "准备申请资源");                    // P操作,每次申请两个资源                    semaphore.acquire(2);                    System.out.println(Thread.currentThread().getName() + "获取资源成功");                    Thread.sleep(1000);                    System.out.println(Thread.currentThread().getName() + "释放资源");                    // V操作,默认释放一个占有的资源                    semaphore.release(2);                }catch (InterruptedException e) {                    e.printStackTrace();                }            }        };        for (int i = 0; i < 20; i++) {            Thread t = new Thread(runnable,String.valueOf(i + 1));            t.start();        }    }

3.2 CountDownLatch

有点类似于大号的join方法

调用await方法的线程需要等待其他线程将计数器减为0才能继续恢复执行。

public static void main(String[] args) throws InterruptedException {        // 等待线程需要等待的线程数,必须等这10个子线程全部执行完毕再恢复执行        CountDownLatch latch = new CountDownLatch(10);        Runnable runnable = new Runnable() {            @Override            public void run() {                try {                    Thread.sleep(new Random().nextInt(1000));                    System.out.println(Thread.currentThread().getName() + "到达终点");                    // 计数器 - 1                    latch.countDown();                }catch (InterruptedException e) {                    e.printStackTrace();                }            }        };        for (int i = 0; i < 10; i++) {            Thread t = new Thread(runnable,"运动员" + i + 1);            t.start();        }        // main线程就是裁判线程,需要等待所有运动员到底终点再恢复执行        // 直到所有线程调用countdown方法将计数器减为0继续执行        latch.await();        System.out.println("比赛结束~最终获胜的是鹏哥,有请冠军给大家高歌一首~");    }

总结

至于CyclicBarrier和Exchanger在本篇就不多介绍,读者可以自行查阅一下官方文档进行仔细的学习~如果有问题可以私信博主,别忘了点赞收藏+关注哦!

来源地址:https://blog.csdn.net/qq_43575801/article/details/128057659

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JUC包(java.util.concurrent)下的常用子类

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java中JUC包(java.util.concurrent)下的常用子类

相信大家已经对并发机制中出现的很多的常见知识点进行了总结,下面这篇文章主要给大家介绍了关于Java中JUC包(java.util.concurrent)下的常用子类的相关资料,文中通过图文以及示例代码介绍的非常详细,需要的朋友可以参考下
2022-12-20

Java中常用的原子类有哪些

小编给大家分享一下Java中常用的原子类有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、什么是原子类Java中提供了一些原子类,原子类包装了一个变量,并且提供了一系列对变量进行原子性操作的方法。我们在多线程环境下对
2023-06-15

Spark RDD常用算子是什么类型的

小编给大家分享一下Spark RDD常用算子是什么类型的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spark RDD常用算子:Value类型Spark之所以比
2023-06-27

wordpress调用当前分类下子分类的方法

本文实例讲述了wordpress调用当前分类下子分类的方法。分享给大家供大家参考。具体分析如下: 自己没用过wordpress博客但是个人认为wordpress有函数可直接来子调用当前分类下的子分类的,但是我找了很久没找到,后来找到一具朋友
2022-06-12

常用的云服务器包括哪些类型

公共云服务是指由第三方提供商提供的云计算服务,如亚马逊AWS、微软Azure和谷歌云平台等。这些云服务通常提供可扩展的计算资源和存储空间,可以帮助用户轻松地管理和扩展云资源。私有云服务是指用户自己拥有服务器的云计算服务,如AmazonWebServices(AWS)、MicrosoftAzure和IBMCloud等。私
常用的云服务器包括哪些类型
2023-10-28

使用java怎么扫描指定包下的类

本篇文章给大家分享的是有关使用java怎么扫描指定包下的类,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java可以用来干什么Java主要应用于:1. web开发;2. And
2023-06-14

常用的云服务器包括哪些功能类型

云服务器是一种基于云计算技术的虚拟服务器,它可以提供多种功能类型,以下是常用的几种:1.计算型云服务器计算型云服务器是一种专门用于处理计算密集型任务的云服务器,它通常配备高性能的CPU和大量的内存,可以快速处理大量的数据和复杂的计算任务。计算型云服务器适用于科学计算、数据分析、人工智能等领域。2.存储型云服务器存储型云服务器是一种专门用于存储大量数据的云服务器,它通常配备大容量的硬盘或固态硬盘,可以存...
2023-10-27

常用的云服务器包括什么功能类型

虚拟化技术是将物理硬件资源虚拟为逻辑资源,以此提高系统的可用性和性能。常用的虚拟化技术包括VMware、Hyper-V和Docker等。VMware是最流行的虚拟化技术之一,Hyper-V可以将多个物理服务器虚拟为多个逻辑服务器,以提高系统的可用性和性能。Docker是一个基于Linux的容器化技术,它可以快速地部署和
常用的云服务器包括什么功能类型
2023-10-28

java同一个包下的类怎么互相调用

在同一个包下的类可以直接互相调用,不需要使用任何关键字或语法来指明调用关系。只需在需要调用的方法前面加上类名即可。例如,假设有两个类A和B在同一个包下,其中A类中有一个方法需要调用B类中的方法,可以直接在A类中调用B类的方法,如下所示:``
2023-08-20

云服务器属于下列哪个分类类型的应用场景包括

数据库数据库是指存储和管理数据的软件系统。云服务器可以为数据库提供高可靠性、高可用性和高扩展性的服务,可以实现数据的快速存储、备份、恢复和数据分析等功能。云存储云存储是指基于网络技术构建的数据存储服务。云存储服务提供商可以为用户提供多种存储和访问方式,如本地存储、云存储、数据库存储等,用户可以根据实际需求选择适合自己的存储方案。视频云视频云是指一种基于云计算技术构建的视频服务。视频云可以提供高质量...
2023-10-27

云服务器属于下列哪个分类类型的应用范围包括

私有云服务器:由客户自己控制和管理。这类云服务器通常提供更高的安全性和控制力,可为用户提供完全的控制权和隐私保护。这类云服务器适合于需要独立的安全性和隐私保护的应用程序,如虚拟主机、数据库服务器等。公共云服务器:通常由多个公司或组织共同管理和托管。这类云服务器可以提供高性能、可扩展性和灵活性,以满足各种规模的应用程序。
2023-10-27

云服务器属于下列哪个分类类型的应用场景中不包括

然而,一些与云计算基础设施密切相关的应用场景,如数据中心、托管服务、安全性等,可能需要云服务器提供支持。在这些应用场景中,云服务器可以提供高性能、高可靠性的计算资源,以支持用户的应用程序。此外,云服务器还可以提供安全性和可靠性保障,以确保用户数据的安全和隐私。总之,虽然云服务器不属于应用场景,但它可以与应用场景密切相关
2023-10-27

web前端:html常用标签、包含关系、常用术语,以及网页设计中的字体分类

编程学习网:网页设计的工作目标,是通过使用更合理的颜色、字体、图片、样式进行页面设计美化,在功能限定的情况下,尽可能给予用户完美的视觉体验。高级的网页设计甚至会考虑到通过声光、交互等来实现更好的视听感受。
web前端:html常用标签、包含关系、常用术语,以及网页设计中的字体分类
2024-04-23

织梦在导航栏下拉菜单中调用当前栏目子类的方法

复制代码代码如下: {dede:channelartlist typeid="top" row='18' currentstyle="
  • 编程客栈
  • 在 Go 中处理解耦的最佳方法是在两个不同的包中使用类似的结构,但结构中的子项使其变得困难?

    在 Go 中处理解耦的最佳方法是使用类似结构但具有不同子项的两个不同包。这种方法可以有效地将代码分离,提高可维护性和模块化程度。然而,当结构中的子项变得复杂时,这种解耦方法可能会变得困难。在这种情况下,可以考虑使用接口和多态的概念来解决问题
    在 Go 中处理解耦的最佳方法是在两个不同的包中使用类似的结构,但结构中的子项使其变得困难?
    2024-02-09

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录