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表达式 ...... 阅读详情

相关推荐

一文详解心电图(ECG)监测原理

介绍心电图的监测原理,从心电信号产生、获取到心电图的基本组成

m0_50146396的博客 3285

多线程8锁

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

weixin_42198596的博客 211

微波传感器 - 从原理到实战,解锁非接触感知新维度

本文深入解析微波传感器的工作原理,重点阐述了其基于多普勒效应的非接触感知机制,并对比了红外、超声波等技术的优劣。通过树莓派Pico与RCWL-0516模块的实战案例,展示了如何构建区域入侵检测器,并探讨了微波传感器在智能家居、工业自动化及汽车电子等领域的广阔应用前景。

weixin_29306571的博客 222

java的8锁问题

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

toBeMN的博客 2833

pikachu靶场: 暴力破解第四关(token防爆破)

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 同时将此 Token 返回给客户端。此外,Token 是有时效的,一段时间之后或下一次请求时用户需要重新验证。

X_shiguang的博客 1720

别再用Excel硬算传热了!用MATLAB/Octave复现国赛数学建模A题(附完整代码与避坑指南)

本文详细介绍了如何利用MATLAB/Octave高效解决数学建模中的传热问题,替代传统的Excel计算方法。通过复现2018年国赛A题的高温作业服传热模型,从理论推导到代码实现,提供了完整的有限差分法解决方案和参数拟合技巧,帮助读者提升数学建模效率和准确性。

weixin_30512965的博客 378

经典 8 锁问题

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

yage124的博客 456

CLion与STM32CubeMX联调:JLink GDB Server高效调试指南

本文详细介绍了如何搭建并配置CLion、STM32CubeMX与JLink GDB Server联调的现代化STM32开发环境。通过一站式环境搭建、工程创建、核心调试配置及高级技巧(如RTT日志),该组合实现了高效的代码编辑、可视化配置与稳定调试,大幅提升嵌入式开发效率与体验。

web99的专栏 258

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

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

weixin_42290025的博客 480

Python实战:逐笔高频因子构建与回测全流程解析

本文详细解析了使用Python构建与回测逐笔高频因子的全流程。从逐笔数据的价值与清洗入手,通过实战代码演示了‘大买成交金额占比’因子的计算逻辑,并重点阐述了因子正交化处理的重要性以剔除风格影响。最后,提供了一个经典的分位数回测框架来验证因子有效性,并分享了数据质量、计算效率与过拟合等核心避坑指南。

grass的博客 391

PyQt5数据库开发3 6 QSqlQuery完整实操案例【图文详解】

PyQt5数据库开发3 6.1 QSqlQuery实操案例【多图详解】,本文有点长,主要每一个步骤都有对应的图文教程!!!

qq_53317005的博客 2961

Java的8锁现象

Java的8锁现象

weixin_56018532的博客 796

共享单车数据抓取与分析:使用Python爬虫抓取共享单车使用数据与地图信息

通过本篇博客,我们展示了如何使用Python爬虫抓取共享单车的使用数据和地图信息,并通过简单的数据分析得出有价值的见解。在实际应用中,数据的收集与分析不仅能帮助城市管理者更好地规划单车站点,还能为用户提供更精准的单车使用体验。未来,我们可以将此分析与机器学习模型相结合,进一步预测单车的使用趋势,优化调度算法,实现更加智能的共享单车管理。

2201_76125261的博客 2204

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JUC上

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

du2lang0的博客 168

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

万文详解JUC(超详细)

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

Laity 815

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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、付费专栏及课程。

余额充值