[Java多线程 八]---JUC包下的锁和工具类

2023-11-13

原文链接 http://www.cnblogs.com/skywang12345/p/3496098.html

概述

根据锁的添加到Java中的时间,Java中的锁,可以分为“同步锁”“JUC包中的锁”

同步锁

实现方式

即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁。Java 1.0版本中就已经支持同步锁了。

原理

同步锁的原理是,对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁。但是,在同一个时间点,该同步锁能且只能被一个线程获取到。这样,获取到同步锁的线程就能进行CPU调度,从而在CPU上执行;而没有获取到同步锁的线程,必须进行等待,直到获取到同步锁之后才能继续运行。这就是,多线程通过同步锁进行同步的原理!

JUC包中的锁

这里写图片描述

实现方式

相比同步锁,JUC包中的锁的功能更加强大,它为锁提供了一个框架,该框架允许更灵活地使用锁,只是它的用法更难罢了。

内容

JUC包中的锁,包括:

接口

Lock接口ReadWriteLock接口Condition条件接口

抽象类

AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer三个抽象类

普通类

ReentrantLock独占锁(可重入同步锁)ReentrantReadWriteLock读写锁LockSupport阻塞原语

由于java.util.concurrent包下的三组信号量工具类CountDownLatchCyclicBarrierSemaphore也是通过AQS来实现的;因此,我也将它们归纳到锁的框架中进行介绍。

锁框架

这里写图片描述

TML

JUC包下锁详述

用到的接口、抽象类和普通类

Lock接口

JUC包中的 Lock 接口支持那些语义不同(重入、公平等)的锁规则。所谓语义不同,是指锁可是有“公平机制的锁”、”非公平机制的锁”、”可重入的锁”等等。

  • “公平机制”是指”不同线程获取锁的机制是公平的”,而”非公平机制”则是指”不同线程获取锁的机制是非公平的”,这里的公平指的是如果公平,那么等待锁的多个线程将会按照申请锁的时间顺序来依次获得锁

  • “可重入的锁”是指同一个锁能够被一个线程多次获取

ReadWriteLock接口

ReadWriteLock 接口以和Lock类似的方式定义了一些读取者可以共享而写入者独占的锁。JUC包只有一个类实现了该接口,即 ReentrantReadWriteLock,因为它适用于大部分的标准用法上下文。但程序员可以创建自己的、适用于非标准要求的实现。

Condition接口

Condition需要和Lock联合使用,它的作用是代替Object监视器方法,可以通过await(),signal()来休眠/唤醒线程。Condition 接口描述了可能会与锁有关联的条件变量。这些变量在用法上与使用 Object.wait 访问的隐式监视器类似,但提供了更强大的功能。需要特别指出的是,单个 Lock 可能与多个 Condition 对象关联。为了避免兼容性问题,Condition 方法的名称与对应的 Object 版本中的不同。

AQS抽象类

AbstractQueuedSynchronizer就是被称之为AQS的类,它是一个非常有用的超类,可用来定义锁以及依赖于排队阻塞线程的其他同步器

ReentrantLock,ReentrantReadWriteLock,CountDownLatch,CyclicBarrier和Semaphore等这些类都是基于AQS类实现的。AbstractQueuedLongSynchronizer 类提供相同的功能但扩展了对同步状态的 64 位的支持。两者都扩展了类 AbstractOwnableSynchronizer(一个帮助记录当前保持独占同步的线程的简单类)

LockSupport类

LockSupport的功能和”Thread中的Thread.suspend()和Thread.resume()有点类似”,LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程但是park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题

具体的实现类

ReentrantLock类

ReentrantLock是独占锁。所谓独占锁,是指只能被独自占领,即同一个时间点只能被一个线程锁获取到的锁互斥同步语义)。ReentrantLock锁包括”公平的ReentrantLock”和”非公平的ReentrantLock”(公平非公平语义)。”公平的ReentrantLock”是指”不同线程获取锁的机制是公平的”,而”非公平的  ReentrantLock”则是指”不同线程获取锁的机制是非公平的”,ReentrantLock是”可重入的锁”(可重入语义)。

这里写图片描述

  • ReentrantLock实现了Lock接口。

  • ReentrantLock中有一个成员变量sync,sync是Sync类型;Sync是一个抽象类,而且它继承于AQS。

  • ReentrantLock中有”公平锁类”FairSync和”非公平锁类”NonfairSync,它们都是Sync的子类。ReentrantReadWriteLock中sync对象,是FairSync与NonfairSync中的一种,这也意味着ReentrantLock是”公平锁”或”非公平锁”中的一种,ReentrantLock默认是非公平锁。

ReentrantReadWriteLock类

ReentrantReadWriteLock是读写锁接口ReadWriteLock的实现类,它包括子类ReadLock和WriteLock。ReadLock是共享锁,而WriteLock是独占锁。

这里写图片描述

  • ReentrantReadWriteLock实现了ReadWriteLock接口。

  • ReentrantReadWriteLock中包含sync对象,读锁readerLock和写锁writerLock读锁ReadLock和写锁WriteLock都实现了Lock接口

  • 和”ReentrantLock”一样,sync是Sync类型;而且,Sync也是一个继承于AQS的抽象类。Sync也包括”公平锁”FairSync和”非公平锁”NonfairSync

辅助工具类

CountDownLatch类

CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。CountDownLatch的UML类图如下:

这里写图片描述

CyclicBarrier类

CyclicBarrier[ˈsaɪklɪk][ˈbæriə(r)]是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

这里写图片描述

CyclicBarrier是包含了“ReentrantLock对象lock”和”Condition对象trip”,它是通过独占锁实现的。

CyclicBarrier和CountDownLatch的区别是:

  (01)* CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。*
  
  (02) CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。

Semaphore

Semaphore[ˈseməfɔ:(r)]是一个计数信号量,它的本质是一个“共享锁“。信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。

这里写图片描述

和”ReentrantLock”一样,Semaphore包含了sync对象,sync是Sync类型;而且,Sync也是一个继承于AQS的抽象类。Sync也包括”公平信号量”FairSync和”非公平信号量”NonfairSync。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Java多线程 八]---JUC包下的锁和工具类 的相关文章

  • Qt的Tcp服务器多线程编程-附带代码展示

    Qt的Tcp服务器多线程编程 附带代码展示 该程序主要实现tcp服务器如何使用多线程的方式来连接多个客户端 此文章没有实现客户端的多线程编程 创建子线程时需要注意的点 1 子线程与主线程之间交互数据时 应采用信号槽的方式 2 子线程中实例化
  • java中synchronized关键字

    1 synchronized关键字简介 synchronized是java中的一个关键字 在中文中为同步 也被称之为 同步锁 以此来达到多线程并发访问时候的并发安全问题 可以用来修饰代码块 非静态方法 静态方法等 修饰代码块时 给当前指定的
  • C++多线程(七):unique_lock详解

    目录 unique lock取代lock guard unique lock的第二个参数 std adopt lock std try to lock std defer lock unique lock的成员函数 成员函数lock 成员函
  • 【JavaEE初阶】第九节.多线程 (基础篇)定时器(案例三)

    作者简介 大家好 我是未央 博客首页 未央 303 系列专栏 JavaEE初阶 每日一句 人的一生 可以有所作为的时机只有一次 那就是现在 前言 一 定时器概述 二 定时器的实现 2 1 Java标准库 定时器的使用 2 2 自己模拟实现一
  • ⛳ 面试题-单例模式会存在线程安全问题吗?

    目录 面试题 单例模式会存在线程安全问题吗 一 单例模式 简介 二 饿汉式 三 懒汉式 3 1 懒汉式 在调用 getInstance 的时候才创建对象 线程不安全 3 2 改造1 对懒汉式进行加锁改造 线程安全 3 3 改造2 对懒汉式继
  • 线程安全的单例模式

    线程安全的单例模式 单例模式 属于创建类型的一种常用的软件设计模式 通过单例模式创建的类在当前进程中只有一个实例 一份资源只能被申请加载一次 如何实现 饿汉模式 资源在程序初始化的时候就去加载 后边使用的时候直接使用 使用会非常流畅 但是有
  • java多线程:线程池和阻塞队列

    一 线程池定义和使用 jdk 1 5 之后就引入了线程池 1 1 定义 从上面的空间切换看得出来 线程是稀缺资源 它的创建与销毁是一个相对偏重且耗资源的操作 而Java线程依赖于内核线程 创建线程需要进行操作系统状态切换 为避免资源过度消耗
  • JUC编程

    1 JUC JUC就是java util concurrent工具包的简称 这是一个处理线程的工具包 JDK 1 5开始出现的 1 传统的synchronized public class Synchronized public stati
  • Kafka 顺序消费方案

    Kafka 顺序消费方案 前言 1 问题引入 2 解决思路 3 实现方案 前言 本文针对解决Kafka不同Topic之间存在一定的数据关联时的顺序消费问题 如存在Topic insert和Topic update分别是对数据的插入和更新 当
  • Java使用多线程导入数据到Oracle中

    Oracle中的设置 多线程导入数据到Oracle中 如果是自己设置主键的值 那么肯定会遇到主键冲突的问题 例如线程A计算出的id为10 max id 1 在A线程还没有完成导入时线程B用相同办法得到的id也是10 这时两个线程都请求插入数
  • java数据迁移程序

    环境 mysql 目标 亿级数据迁移 最终耗时 1 2小时 服务器更佳 建议在晚上或者没人访问的情况下操作 思路 1 不能一下将所有数据 导入到目标数据表 耗时太久 且占用资源 所有就用程序批量执行 每次执行一个范围段 比如第一个线程 1
  • java中什么是并发,如何解决?

    多个进程或线程同时 或着说在同一段时间内 访问同一资源会产生并发问题 银行两操作员同时操作同一账户就是典型的例子 比如A B操作员同时读取一余额为1000元的账户 A操作员为该账户增加100元 B操作员同时为该账户减去 50元 A先提交 B
  • 主线程退出后,子线程会不会退出

    额 好吧 这是个标题党 其实所有的线程都是平级的 根本不存在主线程和子线程 下文所述为了方便 将在main函数中的线程看做主线程 其它线程看成子线程 特此说明 先考虑以下代码 include
  • [Java实现 Scoket实时接收Tcp消息 优化层层叠加]

    目录 前言 基础实现代码 描述 优化代码多线程处理客户端连接和消息接收 描述 再次优化异步实现 以下是使用 CompletableFuture 实现异步处理客户端请求的示例代码 描述 进一步优化的代码 Netty来实现Socket服务器 描
  • 多线程系列之——事件内核对象

    所有内核对象里面事件内核对象是最简单的一个 它包括一个使用计数 还有两个布尔值 一个布尔值用来表示事件是手动重置事件还是自动重置事件 另一个布尔值表示当前是否处于触发状态 当一个手动重置事件被触发的时候 所有等待该事件的线程都能变成调度状态
  • 线程常见方法

    目录 线程常见的方法 设置优先级 Join方法 Sleep方法 setDaemon 线程常见的方法 starto 启动当前线程 表面上调用start方法 实际在调用线程里面的run方法 run 线程类继承Thread类或者实现Runnabl
  • python网络爬虫实战——实时抓取西刺免费代理ip

    参考网上高手示例程序 利用了多线程技术 Python版本为2 7 coding utf8 import urllib2 import re import threading import time rawProxyList checkedP
  • JAVA实现简易HTTP服务器

    说实话 之前完全没有想过 我还能写出服务器 感觉服务器这么高端的东西 能会用就不错了 还能写 不吐槽了 开始了 这次的作业是搭建一个服务器 要能接收请求 并给浏览器返回正确响应 项目的下载地址 项目目标 实现一个简易的多线程服务器 可以处理
  • 多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!

    背景介绍 1 最近有一个大数据量插入的操作入库的业务场景 需要先做一些其他修改操作 然后在执行插入操作 由于插入数据可能会很多 用到多线程去拆分数据并行处理来提高响应时间 如果有一个线程执行失败 则全部回滚 2 在spring中可以使用 T
  • 由一个多线程共享Integer类变量问题引起的。。。

    假设并发环境下 业务代码中存在一些统计操作 为了保证线程安全 开发人员往往会对计数值进行加锁 synchronized 值得注意的是 直接对Integer类型进行加锁 似乎并不会达到预期效果 比如下面这段代码 Integer num new

随机推荐

  • k8s 控制器:Replicaset 和 Deployment

    Deployment 官方文档 https kubernetes io docs concepts workloads controllers deployment k8s 在定义 pod 资源时 可以直接创建一个 kind Pod 类型的
  • 漫画告诉你:区块链到底是什么?

    区块链到底是什么 一幅漫画让你秒懂 区块链技术是指一种全民参与记账的方式 所有的系统背后都有一个数据库 你可以把数据库看成是就是一个大账本 目前是各自记各自的账 由于没有中心化的中介机构存在 让所有的东西都通过预先设定的程序自动运行 不仅能
  • JAVA垃圾分类网站计算机毕业设计Mybatis+系统+数据库+调试部署

    JAVA垃圾分类网站计算机毕业设计Mybatis 系统 数据库 调试部署 JAVA垃圾分类网站计算机毕业设计Mybatis 系统 数据库 调试部署 本源码技术栈 项目架构 B S架构 开发语言 Java语言 开发软件 idea eclips
  • 第一篇 香橙派刷机和开发环境准备(ubuntu20.04版)

    目录 一 香橙派刷ubuntu系统和SSH登录 1 Ubuntu有趣的Codename 2 刷机步骤 ubuntu20 04 格式化TF卡 烧写系统到TF卡 调试串口登陆系统 SSH登陆系统 二 开发环境准备 1 香橙派ubuntu20 0
  • “宝藏”,实用网站整理 - 持续更新ing

    文章目录 一 编程类 1 在线编程工具 1 ideone com 2 Octave Online 3 Anycodes 在线编程 2 编程刷题网站 1 LeetCode 2 牛客网 二 在线工具类 1 菜鸟工具 2 在线工具 程序员的工具箱
  • P2P原理以及如何实现(整理)

    前言 这几天看了p2p的原理以及实现的demo 整理一下 一共分为三部分 第一是概念原理 第二是demo实现 第三是p2p协议相关以及分类 一 概念原理 比较全面的理解 https zhuanlan zhihu com p 30351943
  • 地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法

    原文 WGS 84 到 GCJ 02 的转换 即 GPS 加偏 算法是一个普通青年轻易无法接触到的 公开 的秘密 这个算法的代码在互联网上是公开的 详情请使用 Google 搜索 wgtochina lb 整理后的算法代码请参考 https
  • 什么是外包公司?要不要去外包公司?

    01 什么是软件外包 软件外包分为 人力外包和项目外包两个方向 1 1 劳务派遣 指的是把员工外派到对应的用工企业打 短工 比如很多工程师虽然签约了中软国际 东软 文思海辉 软通动力 润和等软件公司 但实际工作地点是在华为 接受华为员相关负
  • c语言还有用吗?

    c语言还有用吗 这个问题有很多人在问 c语言真的没用吗 答案是有用的 用处还很大呢 这门语言虽然是很早以前发明的 新兴语言如c vb 功能十分强大 但每一个能代替C语言 原因 C
  • 【MySQL-约束篇】

    目录 1 空值 Null 2 默认值 3 主键 4 自增 5 唯一键 6 外键 1 空值 Null 先看一个表结构 Field Type Null Key Default Extra id int 11 YES NULL name
  • Java Long类型的查询结果与前端TypeScript显示不一致,后端传值与前端对不上,出现精度损失

    自己折腾了一个项目 使用的技术是SpringBoot MP Vben admin MySql 今天瞎搞的时候发现了一个让我很懵逼的问题 如下图所示 上方是浏览器打印出来的log 下方是数据库实际存在的数据 或者也可以说是后台接口断点调试的数
  • 电赛猜题?我觉得没用,还不如做好这些!

    01 前言 大家好 我是张巧龙 转眼又到22年电赛 这个公众号上有很多同学可能都参加过电赛 有毕业的已经工作的 也有没毕业的今年要参加 我第一次接触电赛是在大一暑期 从参加电赛到指导学生参加电赛 转眼快十年了 20年省赛有6个省一等奖 21
  • 2021-04-09

    jar 自动装配 springboot帮我们配置了什么 xxxxAutoConfiguration 向容器中自动装配组件 xxxxProperties 自动装配类 装配配置文件中自定义的一些内容 要 导入静态资源 首页 jsp 装配扩展Sp
  • ubuntu安装llvm教程

    安装必要工具 sudo apt get install build essential sudo apt get install cmake sudo apt get install python3 8 安装llvm wget https
  • RabbitMQ--基础--7.4--工作模式--路由模式(Direct)

    RabbitMQ 基础 7 4 工作模式 路由模式 Direct 代码位置 https gitee com DanShenGuiZu learnDemo tree master rabbitMq learn rabbitMq 03 1 介绍
  • GB/T28181-2022图像抓拍规范解读及技术实现

    规范解读 GB28181 2022相对2016 增加了设备软件升级 图像抓拍信令流程和协议接口 我们先回顾下规范说明 图像抓拍基本要求 源设备向目标设备发送图像抓拍配置命令 携带传输路径 会话ID等信息 目标设备完成图像传输后 发送图像抓拍
  • java基础-java的发展进程和特性

    1 JAVA的发展历程 1 1上世纪90年代 由于单片机出现引起了自动控制领域的关注 单片机可以大幅度提升电子消费产品的智能化程度 比如电视机顶盒 烤箱 移动电话等 Sun公司成立了Green的项目小组 专攻计算机在家电产品上的嵌入式开发
  • 总结45 SpringMVC框架的基本应用(替代Servlet)

    流程图 面试用 概念 当要实现在Spring框架下的web服务时 那么servlet将无法兼容 因为Spring无法依赖注入到Servlet 因此将会通过SpringMVC来替代servlet 从而提供WEB服务 也就是说 在今后的实际开发
  • 错误 1452:无法添加或更新子行:外键约束失败

    1452 Cannot add or update a child row a foreign key constraint fails goaread views CONSTRAINT views ibfk 1 FOREIGN KEY s
  • [Java多线程 八]---JUC包下的锁和工具类

    原文链接 http www cnblogs com skywang12345 p 3496098 html 概述 根据锁的添加到Java中的时间 Java中的锁 可以分为 同步锁 和 JUC包中的锁 同步锁 实现方式 即通过synchron