当前位置: 首页 > news >正文

JUC基础-0601

6 多线程锁

6.1 锁的八个问题演示

class Phone {public static synchronized void sendSMS() throws Exception {//停留4秒TimeUnit.SECONDS.sleep(4);System.out.println("------sendSMS");}public synchronized void sendEmail() throws Exception {System.out.println("------sendEmail");}public void getHello() {System.out.println("------getHello");}
}
  1. 标准访问,先打印短信还是邮件

    1. ------sendSMS
    2. ------sendEmail
  2. 停 4 秒在短信方法内,先打印短信还是邮件

    1. ------sendSMS
    2. ------sendEmail
  3. 新增普通的 hello 方法,是先打短信还是 hello

    1. ------getHello
    2. ------sendSMS
  4. 现在有两部手机,先打印短信还是邮件

    1. ------sendEmail
    2. ------sendSMS
  5. 两个静态同步方法,1 部手机,先打印短信还是邮件

    1. ------sendSMS
    2. ------sendEmail
  6. 两个静态同步方法,2 部手机,先打印短信还是邮件

    1. ------sendSMS
    2. ------sendEmail
  7. 1 个静态同步方法,1 个普通同步方法,1 部手机,先打印短信还是邮件

    1. ------sendEmail
    2. ------sendSMS
  8. 1 个静态同步方法,1 个普通同步方法,2 部手机,先打印短信还是邮件

    1. ------sendEmail
    2. ------sendSMS

分析:两点:

  1. 是否用的同一把锁
  2. 锁的范围是怎样的?

6.2 总结

  1. 两个线程的创建之间间隔了100ms,则短信线程先创建,邮件后创建
  2. sleep不会释放锁,两个线程一起等待4秒后,顺序和1一样
  3. hello不同步的,SMS等待4秒,所以先Hello
  4. 两部手机,两个同步监视器,互相不干扰,SMS睡4秒,所以先email
  5. 两个静态方法,锁是静态类的Class,所以顺序和1一样,因为同一把锁
  6. 两个静态方法,两部手机,但是锁还是一个,和5一样
  7. 一个锁是Class,一个锁是this,互相不影响,所以email快,SMS睡4秒所以慢
  8. 两把锁,几个手机都一样,锁不同,顺序和7一样。

具体表现为以下 3 种形式。
对于普通同步方法,锁是当前实例对象。
对于静态同步方法,锁是当前类的
Class 对象。
对于同步方法块,锁是
Synchonized 括号里配置的对象

6.3 公平锁和非公平锁

例如:ReentrantLock的无参构造,就是一个非公平锁,会出现一个线程消耗所有资源,其他线程饿死的问题。

//	非公平锁演示
private Lock lock =  new ReentrantLock();
//	或这样也是非公平锁
private Lock lock =  new ReentrantLock(false);//	公平锁
private Lock lock =  new ReentrantLock(true);

公平锁与非公平锁优缺点:

  1. 非公平锁:
    1. 效率高
    2. 线程饿死
  2. 公平锁:
    1. 阳光普照
    2. 效率相对低
  3. 想要效率高:选非公平锁
  4. 想要公平:公平锁

公平锁与非公平锁源码实现

  1. 非公平锁:占据锁之后之间进行后续操作
static final class NonfairSync extends Sync {private static final long serialVersionUID = 7316153563782823691L;/*** Performs lock.  Try immediate barge, backing up to normal* acquire on failure.*/final void lock() {if (compareAndSetState(0, 1))setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);}protected final boolean tryAcquire(int acquires) {return nonfairTryAcquire(acquires);}
}
  1. 公平锁:里面有一个acquires 参数,并且判断时先执行hasQueuedPredecessors()方法,相当于先礼貌的问一句,这里有人吗;没人就继续操作,有人就会排队。
static final class FairSync extends Sync {private static final long serialVersionUID = -3000897897090466540L;final void lock() {acquire(1);}/*** Fair version of tryAcquire.  Don't grant access unless* recursive call or no waiters or is first.*/protected final boolean tryAcquire(int acquires) {final Thread current = Thread.currentThread();int c = getState();if (c == 0) {if (!hasQueuedPredecessors() &&compareAndSetState(0, acquires)) {setExclusiveOwnerThread(current);return true;}}else if (current == getExclusiveOwnerThread()) {int nextc = c + acquires;if (nextc < 0)throw new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;}
}public final boolean hasQueuedPredecessors() {// The correctness of this depends on head being initialized// before tail and on head.next being accurate if the current// thread is first in queue.Node t = tail; // Read fields in reverse initialization orderNode h = head;Node s;return h != t && ((s = h.next) == null || s.thread != Thread.currentThread());
}

6.4 可重入锁(递归锁)

synchronized(隐式)和Lock(显示)都是可重入锁

synchronized的加锁和释放都是自动的,所以是隐式的;Lock是显式的。

简单讲:如果一个线程拿到了锁,那么所有需要这个锁的地方,他都可以进入了

可重入锁,又称为递归锁,是一种递归无阻塞的同步机制。"可重入"的意思是如果一个线程已经持有了一个锁,那么这个线程可以再次获取同一把锁而不会被锁阻塞。这个特性可以在递归或者需要多次访问同步资源的场合简化编程。

在Java中,synchronized和ReentrantLock都是可重入锁。比如:

public class Example {public synchronized void method1() {method2();}public synchronized void method2() {// do something}
}

在这个例子中,一个线程进入method1方法后,得到了对象锁,然后它可以再次进入method2方法而不会阻塞,因为它已经持有了对象锁。

同样的,使用ReentrantLock也能达到类似的效果:

import java.util.concurrent.locks.ReentrantLock;public class Example {private final ReentrantLock lock = new ReentrantLock();public void method1() {lock.lock();try {method2();} finally {lock.unlock();}}public void method2() {lock.lock();try {// do something} finally {lock.unlock();}}
}

在这个例子中,线程进入method1方法后,获取了锁,然后它可以进入method2方法并再次获取锁,而不会被阻塞。需要注意的是,每次调用lock()方法,引用计数就加1,每次调用unlock()方法,引用计数就减1。只有当引用计数为0时,锁才真正被释放。

这种锁的好处是,同一个线程可以多次获取同一把锁,避免了死锁。缺点是可能导致锁保持得过久,从而影响系统性能。

LocK可重入锁演示:

//Lock演示可重入锁Lock lock = new ReentrantLock();//创建线程new Thread(()->{try {//上锁lock.lock();System.out.println(Thread.currentThread().getName()+" 外层");try {//上锁lock.lock();System.out.println(Thread.currentThread().getName()+" 内层");}finally {//释放锁lock.unlock();}}finally {//释放做lock.unlock();}},"t1").start();

在这段代码里面,如果不释放锁,后面的会获取不到锁。

6.5 死锁

  1. 定义:两个或者两个以上进程在执行过程中,因为争夺资源而造成一种互相等待的现象,如果没有外力干涉,他们无法再执行下去
  2. 产生死锁原因:
    1. 系统资源不足
    2. 进程运行推进顺序不合适
    3. 资源分配不当
  3. 验证死锁命令
    1. jps:ps -ef
    2. jstack :jvm自带堆栈工具

相关文章:

JUC基础-0601

6 多线程锁 6.1 锁的八个问题演示 class Phone {public static synchronized void sendSMS() throws Exception {//停留4秒TimeUnit.SECONDS.sleep(4);System.out.println("------sendSMS");}public synchronized void sendEmail() throws Exception {System.out.p…...

bash特性

bash bash是一个命令处理器&#xff0c;运行在文本窗口zh哦那个&#xff0c;执行用户输入的命令。 1、bash特性–历史命令 保留用户的历史执行的命令&#xff0c;可以使用history查看之前执行过的命令 #通过$HISTORY查看保存的命令条数 echo $HISTORY #存放用户执行的历史…...

[Flink] Flink On Yarn(yarn-session.sh)启动错误

在Flink上启动 yarn-session.sh时出现 The number of requested virtual cores for application master 1 exceeds the maximum number of virtual cores 0 available in the Yarn Cluster.错误。 版本说明&#xff1a; Hadoop&#xff1a; 3.3.4 Flink&#xff1a;1.17.1 问题…...

玩转css逐帧动画,努力成为更优质的Ikun~

&#x1f389; 一、前言 css3的animation想必大家都知道吧&#xff0c;那 steps 逐帧动画你知道吗&#xff1f;对于我来说&#xff0c;实际工作及练习中也很少用到这种跳跃式变化的动画&#xff0c;而它start和end的解释又比较“不说人话”&#xff0c;以前用到steps动画的时候…...

Linux Capabilities

Linux Capabilities是一种细粒度的权限管理机制,用于将root用户的特权划分为具体的功能集。它允许将部分root特权授予非root进程。 可以在shell中运行: man capabilities将显示capability man page,其中包含有关Linux功能的详细信息。 文章目录 什么是CapabilitiesLinux Cap …...

【自制C++深度学习框架】前言

KuiperCourse 介绍 此GitHub项目是一个初学者的深度学习框架&#xff0c;使用C编写&#xff0c;旨在为用户提供一种简单、易于理解的深度学习实现方式。以下是本项目的主要特点和功能&#xff1a; 计算图&#xff1a;使用计算图来描述深度学习模型的计算过程&#xff0c;利用计…...

【高危】泛微 e-cology9 存在任意用户登录漏洞

漏洞描述 泛微协同管理应用平台(e-cology)是一套企业大型协同管理平台。 泛微e-cology9部分版本中存在前台任意用户登录漏洞&#xff0c;由于系统默认配置固定密钥进行用户身份验证。 当存在/mobile/plugin/1/ofsLogin.jsp文件时&#xff08;可能通过插件方式安装&#xff0…...

1TB文本的实时全文检索系统搭建

1个T的文本是多大呢&#xff1f;1TB 1000GB&#xff0c;1GB是10亿&#xff0c;1TB就是1万亿字节。如果是英文字符&#xff0c;1TB文本就是1万亿个英文字符&#xff0c;如果是中文字符而且都是UTF8格式&#xff0c;1个中文字符占3个字节&#xff0c;1TB文本是3333亿中文字符&am…...

RHCA---DO477---变量实验

实验目的如下: 1. 环境准备: 使用命令lab inventory-variables start初始化环境 2. 进入/home/student/git-repos目录克隆下载http://git.lab.example.com:8081/git/inventory-variables.git 3. 将目录下yaml文件内容以group_vars形式修改 4. 部署并将修改后ansible-playbook代…...

毕业生高频常用材料线上签,高校毕业季契约锁电子签章一站式助力

据人社部消息&#xff0c;2023年全国高校毕业生总规模将达1158万人&#xff01;毕业季开启&#xff0c;全国各地高校普遍面临三方协议、成绩单、证书、证明等毕业生高频常用材料签署量激增的现状。学生、教职工、学校常常疲于应对机械化的材料盖章工作。 #毕业季高频常用材料清…...

.ini配置文件介绍与解析库使用

【前言】 ini 文件是英文"Initialization"的缩写&#xff0c;即初始化文件。它用来配置特定应用软件以实现对程序初始化或进行参数设置。.ini文件由节(section)、键(key)、值(value)三种模块构成。在windows系统/嵌入式软件中有很多XXX.ini文件&#xff0c;例如Syste…...

牛客网Linux错题七

1.如何在命令行查看一台linux机器的CPU、SWAP分区信息、硬盘信息&#xff1f;(ACD) A. cat /proc/cpuinfo B. du C. cat /proc/swaps D. df -Ih 解&#xff1a; cat /proc/cpuinfo查看Linux设备的CPU信息&#xff0c;cat /proc/swaps查看Linux设备的交换分区信息&#xf…...

牛课刷题Day5(编程题)

1.合并数组 arr1 和数组 arr2。不要直接修改数组 arr&#xff0c;结果返回新的数组 正确答案&#xff1a; function concat(arr1, arr2) {let carr1.concat(arr2)return c } 解析&#xff1a; js的Array对象提供了一个叫concat()方法&#xff0c;连接两个或更多的数组&#x…...

javascript基础二十五:说说你对函数式编程的理解?优缺点?

一、是什么 函数式编程是一种"编程范式"&#xff08;programming paradigm&#xff09;&#xff0c;一种编写程序的方法论 主要的编程范式有三种&#xff1a;命令式编程&#xff0c;声明式编程和函数式编程 相比命令式编程&#xff0c;函数式编程更加强调程序执行…...

常见JavaScript加密算法、JS加密算法

常见JavaScript加密算法、JS加密算法 一、SHA-256加密算法二、Base64编码算法三、RSA加密算法四、AES加密算法五、HMAC-SHA256算法六、PKCS7填充 一、SHA-256加密算法 SHA-256是一种密码散列函数&#xff0c;可以将任意长度的消息压缩成256位的摘要值。以下是使用JavaScript实现…...

题解2023.6.5

D - Factorial Divisibility 对于a[i]>x的数一定可以整除&#xff0c;考虑a[i]<x的数&#xff0c;因为(x1)*x! (x1)! 统计ai出现的次数, 把他转换为大的阶乘, 如果, 最终1到x - 1, ai的出现次数均为0则说明可以被x!整除 #pragma GCC optimize(2) #pragma GCC optimiz…...

与声音计算研究相关的挑战赛——DCASE和L3DAS

前言&#xff1a;在本专栏的系列博文中&#xff0c;我将包含声学场景识别、声音事件检测、声源位置估计等利用机器学习或深度学习技术进行研究的、基于声音信号的相关工作成为“声音计算”。 本篇博文主要介绍与声音计算相关的两个近些年持续跟进的挑战赛&#xff1a;DCASE和L…...

实训总结-----Scrapy爬虫

1.安装指令 pip install scrapy 2.创建 scrapy 项目 任意终端 进入到目录(用于存储我们的项目) scrapy startproject 项目名 会在目录下面 创建一个以 项目名 命名的文件夹 终端也会有提示 cd 项目名 scrapy genspider example example.com 3.运行爬虫指令 scrapy craw…...

前端开发职业规划指南:如何做好职业规划与发展

引言 前端开发是目前互联网行业中最火热的职业之一&#xff0c;也是非常具有发展前景的职业之一。随着互联网技术的不断更新和发展&#xff0c;前端开发的职业规划也在不断地发生变化。本文将从几个方面来探讨前端开发的职业规划。 一、职业发展路径 1.前端初级工程师 前端初…...

创业第一步:如何写好商业计划书

即使你的项目不需要融资&#xff0c;你也把标准商业计划书作为一个工具模板来应用&#xff0c;帮助更全面的盘点你要做的事情。 撰写一份性感的商业计划书如同造房子&#xff1a;第一步是科学设计&#xff0c;打好结构&#xff08;有清晰的撰写逻辑&#xff09;&#xff1b;第…...

【Linux驱动】字符设备驱动相关宏 / 函数介绍(module_init、register_chrdev)

驱动运行有两种方式&#xff1a; 方式一&#xff1a;直接编译到内核&#xff0c;Linux内核启动时自动运行驱动程序方式二&#xff1a;编译成模块&#xff0c;使用 insmod 命令加载驱动模块 我们在调试的时候&#xff0c;采用第二种方式是最合适的&#xff0c;每次修改驱动只需…...

axios解决跨域问题

Vue3中使用axios访问聚合的天气API&#xff0c;出现跨域问题&#xff0c;需要在前端进行一些配置&#xff1a; 首先是修改vue.config.js&#xff1a; const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServe…...

R语言作图——热图聚类及其聚类结果输出

代码 不多说了&#xff0c;做个记录&#xff0c;代码如下。 library(pheatmap) library(RColorBrewer) # args commandArgs(TRUE) betafile "twist_common_panel_434.csv" infofile "twist_common_panel_434.txt" title "twist_common_panel&qu…...

Tomcat优化

Tomcat优化 Tomcat默认安装下的缺省配置并不适合生产环境&#xff0c;它可能会频繁出现假死现象需要重启&#xff0c;只有通过不断压测优化才能让它最高效率稳定的运行。优化主要包括三方面&#xff0c;分别为操作系统优化&#xff08;内核参数优化&#xff09;&#xff0c;Tom…...

我的GIT练习TWO

目录 前言 GIT安装教程 Git作者 GIT优点 GIT缺点 为什么要使用 Git GIT练习TWO C1 C2 C3 C4 C5 C6 C7 总结 前言 Git 是一个分布式版本控制及源代码管理工具;Git 可以为你的项目保存若干快照&#xff0c;以此来对整个项目进行版本管理 GIT安装教程 点击进入查看教程…...

个人器件库整理

样品本 包含如下&#xff1a; 电容器件&#xff1a; 元件值封装备注钽电容47uF 10V1206钽电容10uF 10V1206电容10uF 10% 10V0603X5R&#xff0c;CL10A106KP8NNNC 元件值封装备注100nF电容50V&#xff0c;10%0603 电阻器件&#xff1a; 元件值封装备注75 Ω \Omega Ω…...

javascript——内存管理

JavaScript内存管理是Web开发中的一个重要主题。正确管理内存可以提高应用程序的性能和稳定性。本文将介绍JavaScript中的内存管理概念、常见的内存泄漏问题以及一些有效的内存管理技巧。 什么是JavaScript内存管理&#xff1f; JavaScript具有自动内存管理机制&#xff0c;开…...

Qt5.15.2安卓Android项目开发环境配置

1、Qt Creator 4.11.2 官方下载&#xff1a;https://download.qt.io/archive/qtcreator/4.11/4.11.2/ 镜像下载&#xff1a;https://mirrors.cloud.tencent.com/qt/archive/qtcreator/4.11/4.11.2/ 2、Qt 5.15.2 Android 官方更新器内部下载 参考&#xff1a;https://blog…...

第四十三章 弹跳训练2(灵识扫描)

“再不脱离便会陷死在里面。”这个声音似乎来自脑海深处某个隐秘角落。 双眼一睁&#xff0c;灵识退去&#xff0c;空空的头壳兀自嗡嗡作响&#xff0c;一股说不清道不明的失落感笼罩全身&#xff0c;似要将自己拖入抑郁的谷底。 不&#xff01;没什么好失落沮丧的&#xff01;…...

【location对象的方法,history对象,navigator--BOM】

location对象的方法 location.assign()//跟href一样&#xff0c;可以跳转页面&#xff08;也称重定向页面&#xff09; location.replace()//替换当前页面&#xff0c;因为不记录历史&#xff0c;所以不能后退页面 location.reload()//重新加载页面&#xff0c;相当于刷新按钮或…...

网站建设的cms系统/seo工作流程图

PowerBI 十一月的更新终于有了一个解决密集恐惧症患者的方法&#xff0c;建模视图每个tab专注于一个领域&#xff0c;更加简洁。 ps: Microstrategy早就有了。 转载于:https://www.cnblogs.com/lizardbi/p/DAX-PATTERN-POWERBI-ModellingView.html...

如何做淘宝cms导购网站/百度网址链接是多少

前些天在学习linux下的驱动编写&#xff0c;找到了一块之前淘到的液晶屏&#xff0c;主控芯片是ili9341&#xff0c;分辨率为240*320的屏幕&#xff0c;接口方式是SPI的&#xff0c;心血来潮想搞一下。不过奈何驱动水平不到家&#xff0c;只是开发出了一种杂交方法&#xff0c;…...

网站的开发环境设计/seo数据是什么意思

我愿称之为丑陋数组好吧 时隔数日&#xff0c;重做了一遍&#xff0c;在一开始想思路的时候&#xff0c;想得有点久&#xff0c;其实两句话概括。 // 1 // 1 2 // 1 3 2 // 1 3 2 4 要求两个数的漂亮数组&#xff0c;要从一个数的出发&#xff0c;将一个数乘2-1变为奇数放在左…...

做网站建设的价格/沈阳seo排名优化教程

我们知道&#xff0c;硬件设备是影响电脑运行速度的一个主要因素&#xff0c;在强大的win7系统之中&#xff0c;咱们也可以通过对硬件的一些调整来实现电脑流畅度的提升&#xff0c;例如咱们win7电脑中就有一个硬件加速的选项按钮&#xff0c;只需要点击一下&#xff0c;就能提…...

关于做旅游网站的参考文献/建立网站一般要多少钱

序曲出塞二首 其一【唐】 秦时明月汉时关&#xff0c;万里长征人未还。但使龙城飞将在&#xff0c;不教胡马度阴山。这是一首边塞诗&#xff0c;昌龄从描写景物景入手&#xff0c;首句勾勒出一幅冷月照边关的苍凉景象。"秦时明月汉时关"暗示了这里的战事自秦汉以来一…...

北京疫情防控网络发布预告/上海官网seo

面向网络游戏的“云”应用平台浅析——2009-1-15 CTO俱乐部第一次聚会“云计算”后记 CTO俱乐部第一次聚会的主题是“云计算”&#xff0c;关于聚会的概述发表在&#xff1a;  2009-1-15 CTO俱乐部第一次聚会&#xff0c;http://blog.csdn.net/hu_zhenghui/archive/2009/01/1…...