JUC之多线程锁的8个问题分析

JUC框架 源码解析系列文章目录 JDK8 前言 笔者在接下来这段时间将对JUC框架内的重点内容进行深度解析,由于内容颇多,需要分成多篇文章,所以在这里列一个目录,方便大家翻阅。 目录 JUC框架的基础是CAS和自旋,而CAS则是利用Unsafe类提供的CAS操作,而原子类则依靠于CAS和自旋。下面几篇文章从源码分析JUC框架内的几个重要的原子类。 JUC AtomicInteger源码解析 JDK8 JUC AtomicIntegerArray源码解析 JDK8 JUC AtomicStampedReference源码解析 JDK8 AQS(A 阅读详情

1. 程序代码

package com.atguigu.thread;import java.util.concurrent.TimeUnit;class Phone{public synchronized void sendSMS() throws Exception{System.out.println("------sendSMS");}public synchronized void sendEmail() throws Exception{System.out.println("------sendEmail");}public void getHello(){System.out.println("------getHello");}}/**** @Description: 8锁* @author xialei*1 标准访问,先打印短信还是邮件2 停4秒在短信方法内,先打印短信还是邮件3 新增普通的hello方法,是先打短信还是hello4 现在有两部手机,先打印短信还是邮件5 两个静态同步方法,1部手机,先打印短信还是邮件6 两个静态同步方法,2部手机,先打印短信还是邮件7 1个静态同步方法1个普通同步方法,1部手机,先打印短信还是邮件8 1个静态同步方法1个普通同步方法,2部手机,先打印短信还是邮件* ---------------------------------**/public class Lock_8{public static void main(String[] args) throws Exception{Phone phone = new Phone();Phone phone2 = new Phone();new Thread(() -> {try {phone.sendSMS();} catch (Exception e) {e.printStackTrace();}}, "AA").start();Thread.sleep(100);new Thread(() -> {try {phone.sendEmail();//phone.getHello();//phone2.sendEmail();} catch (Exception e) {e.printStackTrace();}}, "BB").start();}}

2. 锁的8个问题

(1) 标准访问,先打印短信还是邮件

(2) 停4秒在短信方法内,先打印短信还是邮件

(3) 普通的hello方法,是先打短信还是hello

(4) 现在有两部手机,先打印短信还是邮件

(5) 两个静态同步方法,1部手机,先打印短信还是邮件

(6) 两个静态同步方法,2部手机,先打印短信还是邮件

(7) 1个静态同步方法,1个普通同步方法,1部手机,先打印短信还是邮件

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

3. 锁的8个问题分析

一个对象里面如果有多个synchronized方法,某一个时刻内,java培训只要一个线程去调用其中的一个synchronized方法了,其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些synchronized方法。

锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法。

加个普通方法后发现和同步锁无关。

换成两个对象后,不是同一把锁了,情况立刻变化。

synchronized实现同步的基础:Java中的每一个对象都可以作为锁。

具体表现为以下3种形式。

对于普通同步方法,锁是当前实例对象。

对于静态同步方法,锁是当前类的Class对象。

对于同步方法块,锁是Synchonized括号里配置的对象

当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。

也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁,可识别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,所以毋须等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。

所有的静态同步方法用的也是同一把锁——类对象本身,这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞态条件的。但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象!

 

JUC高并发编程从入门到精通(全) 目录前言 前言 在了解这部分内容的时候 先要了解java的一些基础内容 java零基础从入门到精通(全) javaSE从入门到精通(全) 所谓JUC是java.util .concurrent 工具包的简称这是一个处理线程的工具包可以实现多线程高并发的内容 了解该部分内容先了解线程与进程的相关概念 【操作系统】线程与进程的深入剖析(全) java之Thread类详细分析(全) 以及涉及到的lambda表达式函数的概念 java中lambda表达式 ...... 阅读详情

相关推荐

STM32F407+HAL库+W5500实现TCP通讯 个人项目总结

推荐阅读此博客 cv即可成功首先需要一个可以进行串口调试的工程,方便进行调试。1.在W5500官网移植库文件重点是Ethernet这个文件夹将里面的 socket.c,socket.h,wizchip_conf.c,wizchip_conf.h,还有根据W5500文件夹里的w5500.c和w5500.h移植到自己的工程里面。然后再创建一个.c和.h文件 我的叫w5500_port_hal.c 和w5500_port_hal.h 记得将.h文件链接到工程里。

a234abr的博客 2246

多线程8锁

标准访问,请问先打印邮件还是短信? 邮件方法暂停4秒钟,请问先打的邮件还是短信? 新增一个普通方法hello(),请问先打印邮件还是hello? 两部手机,请问先打印邮件还是短信? 两个静态同步方法,同一部手机,请间先打印邮件还是短信? 两个静态同步方法,2部手机,请问先打印邮件还是短信? 1个普通同步方法,1个静态同步方法,1部手机,请间先打印邮件还是短信? 1个普通同步方法,1个静态同步方法,2部手机,请问先打印邮件还是短信? ...

weixin_42198596的博客 211

【pprof】简要学习教程

基本介绍 pprof 是在做性能优化前的性能分析工具。 安装: go get -u github.com/google/pprof 分析工具 go tool pprof 是命令行指令,用于分析 Profiling 数据,源数据可以是 http 地址,也可以是已经 dump 下当 profile 文件;查看模式可以命令行交互模式,也可以是浏览器模式(-http 参数)。 两种应用 服务型应用 _ "net/http/pprof" 包,专用于采集 web 服务 运行数据的分析。即在运行的服务中通过 API .

码农印象 883

java的8锁问题

正经学徒,佛系记录,不搞事情 8锁即8个关于锁执行顺序的问题 解决问题前,首先需要明白的是 synchronized 只会锁两样东西,一样是调用的对象,一样是Class 问题一:两个普通的锁方法,new一个对象调用,调用过程中间睡1秒,执行结果是什么 public class Test { public static void main(String[] args) thro...

toBeMN的博客 2833

同花顺Supermind量化交易 风险控制建模--海龟交易法则

A.市场与标的海龟交易法则应用于流动性高的市场中,选择交易量较大的标的进行交易。本文以沪深300指数ETF为标的,构建海龟交易法则。B、仓位:仓位是海龟交易系统最核心的部分,通过ATR真实波幅指标来管理仓位。第一步:计算True Range,简称TR。TR = Max ( H−L , H−P , P−L ) ,其中H为当日日内最高价,L为当日日内最低价,P为前一日收盘价。第二步:计算ATRATR = mean ( TR , 20 ) , 即计算过去20天的TR的平均值,ATR是TR的移动平均值。

qq_22808537的博客 1496

【一 扣子客户案例合集】【 1.1 抖音电商:通过扣子智能体重塑电商服务新体验】

**摘要:**抖音电商借助扣子(Coze)智能体平台重塑客服体验,通过无代码开发、多模态交互和跨平台发布等功能,解决了传统客服高峰期压力大、成本高及响应机械等痛点。智能体采用直接面客与人工监管结合模式,实现高效精准服务,并通过解构流程、模块化设计优化系统架构。其技术优势包括零配置学习、意图识别、情绪感知等,实际应用中显著提升客服效率300%以上,改善用户体验。未来将进一步拓展至商品推荐、直播互动等场景,推动电商服务智能化升级。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1569

经典 8 锁问题

示例代码 1、资源类 import java.util.concurrent.TimeUnit; public class Phone { // 此方法根据题目需要添加 static public synchronized void sendSMS() { // 使用 TimeUnit 工具类执行 sleep 方法,比 Thread.sleep(毫秒), // 方便控制输入的时间单位 // 根据题目要求设置该方法的休眠时间 try { TimeUnit.SEC

yage124的博客 456

【Windows Server 2019】企业虚拟专用网络服务的配置和管理(上)

博文介绍了部署企业虚拟专用网的定义,目的,以及好处。同时说明了实验拓扑图以及虚拟专用网络的工作原理。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 1万+

经典8锁问题--助你彻底搞懂锁的概念

一个被static+synchronized 修饰的方法和普通的synchronized方法,先执行sendEmail()还是callPhone()?* 同被static+synchronized 修饰的两个方法,是先sendEmail()还是callPhone()?* 被synchronized 修饰的普通方法和静态方法 是先sendEmail() 还是 callPhone()?* 被synchronized 修饰的方式和普通方法 先执行sendEmail() 还是 callPhone()

weixin_42290025的博客 480

【Java基础知识 19】Java接口的作用和意义

Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

学Java,找哪吒 2万+

高斯过程的数学理解

G澳大利亚的过程是有益的,特别是当我们有少量数据时。当我在制造业担任数据科学家时,我们的团队使用这种算法来揭示我们接下来应该进行哪些实验条件。但是,此算法不如其他算法流行。在这篇博客中,我将通过可视化和 Python 实现来解释高斯过程 [1] 的数学背景。

gongdiwudu的专栏 3605

Java的8锁现象

Java的8锁现象

weixin_56018532的博客 796

OCR文字识别领域经典论文总结

本篇将介绍文字识别经典论文,内容包括文字检测、文字识别、端到端识别等方法,具体将分别对论文算法简介、思路、代码等几个部分展开介绍。目前各部分只举例经典论文,算法没有全部写完,后续会将在此部分基础上更新更多论文综述及代码实战部分。.................................

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 1万+

JUC 之多线程锁的 8 个问题分析

1. 程序代码 package com.atguigu.thread;import java.util.concurrent.TimeUnit;class Phone{public synchronized void sendSMS() throws Exception{System.out.println("------sendSMS");}public synchronized void sendEmail() throws Exception{System.out.println("-----..

java_atguigu的博客 159

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JUC上

JUC(java.util .concurrent)并发编程 1. 什么是JUC JUC就是java.util.concurrent下面的类包,专门用于多线程的开发。 2. 线程和进程 进程是操作系统中的应用程序、是资源分配的基本单位,线程是用来执行具体的任务和功能,是CPU调度和分派的最小单位 一个进程往往可以包含多个线程,至少包含一个 1)进程 一个程序,QQ.EXE Music.EXE;数据+代码+pcb 一个进程可以包含多个线程,至少包含一个线程! Java默认有几个线程?2个线程! main线

du2lang0的博客 168

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

万文详解JUC(超详细)

万文详解JUC并发编程:测试用例、源码分析、知识拓展,对java.util中并发工具包进行深度解析。

Laity 815

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java并发编程学习篇1_JUC概述、虚假唤醒问题、JUC的生产者和消费者关系、8锁问题(对象锁、类锁区别)

目录 回顾 一、回顾 概念 并发编程 主要涉及的三个类java.util.concurrent、 java.util.concurrent.automic、 java.util.concurrent.locks 注意java实际上是开启不了线程的,而是调用本地方法,底层是c++开启线程,java是运行在虚拟机上的,无法直接操作硬件 线程的几个状态 new 新生 runnable 运行 blocked 阻塞 waiting 等待 timed_witing 超时等待 terminated 终止 wa

xiaosi的博客 1036

java - JUC

1.什么是JUC? java.util.concurrent在并发编程中使用的工具类 2.线程 和 进程 进程:一个程序,QQ.exe Music.exe 程序的集合 一个进程往往可以包含多个线程,至少包含一个! java 默认有几个线程?两个 main GC(垃圾回收) 线程:开了一个进程 Typora ,写字,自动保存(线程负责) 对于java而言:Thread,Runnable,Callable 方式实现多线程 java 不可以开启线程,无法操作硬件,因为它是运行在虚拟机中的,java 是通过本地方法

saienenen的博客 225

JUC并发编程学习笔记二(狂神)

1、生产者和消费者问题Synchronized版 package com.kuang.pc; /** * 线程之间的通信问题:生产者和消费者问题! 等待唤醒,通知唤醒 * 线程交替执行 A B 操作同一个变量 num = 0 * A num+1 * B num-1 */ public class A { public static void main(String[] args) { Data data = new Data(); new

兴趣是最好的老师 421

JUC全面解析-一文带你掌握JUC

本文深入解析了Java并发工具包(JUC)的核心概念和实践应用。从线程池的创建与管理到原子操作类,再到锁机制和并发集合的使用,每个部分都通过详实的讲解帮助读者全面掌握JUC的关键知识点。我们将通过对CAS机制、AQS(抽象队列同步器)、各种同步工具(如CountDownLatch、CyclicBarrier、Semaphore)、ForkJoin框架等的讲解

weixin_67796933的博客 7829

JUC——8锁问题

当关键字用于方法或代码块时,它可以用来实现对象级别的锁和类级别的锁。当用于非静态方法时,锁对象是调用该方法的实例对象。即每个对象实例都有自己的锁。当用于代码块时,锁对象可以是任意的Java对象。通常情况下,我们使用某个共享资源作为锁对象。无论是方法级别的锁还是代码块级别的锁,同一时间只能有一个线程获得锁并执行同步代码,其他线程需要等待锁释放。当用于静态方法时,锁对象是当前方法所属的类对象(Class对象)。类级别锁是针对整个类的所有对象实例生效的,不同实例之间共享这个锁。

鹏鹏2077 1129

JUC并发编程

JUC并发编程 JUC简介 进程、线程的关系 Java默认有两个线程 线程的六种状态 并发、并行的关系: Lock锁 Synchronized 和 Lock的区别 8锁现象 问题一 : 在标准情况下,两个线程先打印 发短信 还是 打电话 ? 问题二 : 在发短信方法中,延迟4秒,两个线程先打印 发短信 还是 打电话? 问题三 : Phone类增加一个普通方法,线程B调用,那么两个线程先打印 发短信

识时务者的个人博客 14万+

java--JUC快速入门(彻底搞懂JUC)

java–JUC快速入门(彻底搞懂JUC) 文章目录java--JUC快速入门(彻底搞懂JUC)1、学习多线程之前需要知道的一些概念。2、JUC的结构3、Lock锁(重点)4、集合类不安全5、Callable()6、常用的辅助类7、读写锁8、阻塞队列9、线程池 1、学习多线程之前需要知道的一些概念。 1.1 JUC是什么? JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!...

weixin_43888181的博客 12万+

JUC--8锁现象(对于锁的理解)

两个同步方法变成了静态同步方法,因为static锁的是class类模板,而class类模板全局唯一,所以就想问题1一样.因此是先发短信。因为静态同步方法锁的是 全局唯一的Class类模板,而同步方法,锁的是当前对象this,两个锁,因此谁快谁先执行,所以先打电话。是先发短信,因为synchronized 锁的对象是方法的调用者,两个方法用的是同一个锁,谁先拿到,谁先执行。因为是两个对象,有两个调用者,所以有两个锁,那就是谁快谁先执行,而发短信被延迟4秒,因此是打电话。2.同样也是发短信,因为是同一个锁。

m0_73856804的博客 822

JUC多线程

得此章,JUC可结

weixin_52634451的博客 1066

深入理解JUC的8锁现象

深入理解JUC的8锁现象

qq_51447436的博客 8349
上一篇: 新特性,可以替代Canal的数据同步方案—Flink-CDC
下一篇: AngularJS四大特征
IT小谷
博客等级 码龄5年 33粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值