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

JUC并发编程-8锁现象

5. 8锁现象

如何判断锁的是谁!锁到底锁的是谁?

锁会锁住:对象、Class

深刻理解我们的锁

问题1

两个同步方法,先执行发短信还是打电话

public class dome01 {public static void main(String[] args) {Phone phone = new Phone();	new Thread(() -> { phone.sendMs(); }).start();TimeUnit.SECONDS.sleep(1);new Thread(() -> { phone.call(); }).start();}
}class Phone {public synchronized void sendMs() {System.out.println("发短信");}public synchronized void call() {System.out.println("打电话");}
}
输出结果为发短信打电话

问题2:

我们再来看:我们让发短信 延迟4s

public class dome01 {public static void main(String[] args) throws InterruptedException {Phone phone = new Phone();new Thread(() -> {try {phone.sendMs();} catch (InterruptedException e) {e.printStackTrace();}}).start();TimeUnit.SECONDS.sleep(1);new Thread(() -> { phone.call(); }).start();}
}class Phone {public synchronized void sendMs() throws InterruptedException {TimeUnit.SECONDS.sleep(4);System.out.println("发短信");}public synchronized void call() {System.out.println("打电话");}
}
结果:还是先发短信,然后再打电话!

原因:并不是顺序执行,而是synchronized 锁住的对象是方法的调用!对于两个方法用的是同一个锁,谁先拿到谁先执行,另外一个等待

问题三

加一个普通方法

public class dome01 {public static void main(String[] args) throws InterruptedException {Phone phone = new Phone();new Thread(() -> {try {phone.sendMs();} catch (InterruptedException e) {e.printStackTrace();}}).start();TimeUnit.SECONDS.sleep(1);new Thread(() -> { phone.hello(); }).start();}
}class Phone {public synchronized void sendMs() throws InterruptedException {TimeUnit.SECONDS.sleep(4);System.out.println("发短信");}public synchronized void call() {System.out.println("打电话");}public void hello() {System.out.println("hello");}
}
输出结果为hello发短信

原因:hello是一个普通方法,不受synchronized锁的影响,不用等待锁的释放

问题四

如果我们使用的是两个对象,一个调用发短信,一个调用打电话,那么整个顺序是怎么样的呢?

public class dome01 {public static void main(String[] args) throws InterruptedException {Phone phone1 = new Phone();Phone phone2 = new Phone();new Thread(() -> {try {phone1.sendMs();} catch (InterruptedException e) {e.printStackTrace();}}).start();TimeUnit.SECONDS.sleep(1);new Thread(() -> { phone2.call(); }).start();}
}class Phone {public synchronized void sendMs() throws InterruptedException {TimeUnit.SECONDS.sleep(4);System.out.println("发短信");}public synchronized void call() {System.out.println("打电话");}public void hello() {System.out.println("hello");}
}
输出结果打电话发短信

原因:两个对象两把锁,不会出现等待的情况,发短信睡了4s,所以先执行打电话

问题五、六

如果我们把synchronized的方法加上static变成静态方法!那么顺序又是怎么样的呢?

(1)我们先来使用一个对象调用两个方法!

答案是:先发短信,后打电话

(2)如果我们使用两个对象调用两个方法!

答案是:还是先发短信,后打电话

原因是什么呢? 为什么加了static就始终前面一个对象先执行呢!为什么后面会等待呢?

原因是:对于static静态方法来说,对于整个类Class来说只有一份,对于不同的对象使用的是同一份方法,相当于这个方法是属于这个类的,如果静态static方法使用synchronized锁定,那么这个synchronized锁会锁住整个对象!不管多少个对象,对于静态的锁都只有一把锁,谁先拿到这个锁就先执行,其他的进程都需要等待!

问题七

如果我们使用一个静态同步方法、一个同步方法、一个对象调用顺序是什么

public class dome01 {public static void main(String[] args) throws InterruptedException {Phone phone1 = new Phone();
//        Phone phone2 = new Phone();new Thread(() -> {try {phone1.sendMs();} catch (InterruptedException e) {e.printStackTrace();}}).start();TimeUnit.SECONDS.sleep(1);new Thread(() -> { phone1.call(); }).start();}
}class Phone {public static synchronized void sendMs() throws InterruptedException {TimeUnit.SECONDS.sleep(4);System.out.println("发短信");}public synchronized void call() {System.out.println("打电话");}public void hello() {System.out.println("hello");}
}
输出结果打电话发短信

原因:因为一个锁的是Class类的模板,一个锁的是对象的调用者。所以不存在等待,直接运行。

问题八

如果我们使用一个静态同步方法、一个同步方法、两个对象调用顺序是什么?

public class dome01 {public static void main(String[] args) throws InterruptedException {Phone phone1 = new Phone();Phone phone2 = new Phone();new Thread(() -> {try {phone1.sendMs();} catch (InterruptedException e) {e.printStackTrace();}}).start();TimeUnit.SECONDS.sleep(1);new Thread(() -> { phone2.call(); }).start();}
}class Phone {public static synchronized void sendMs() throws InterruptedException {TimeUnit.SECONDS.sleep(4);System.out.println("发短信");}public synchronized void call() {System.out.println("打电话");}public void hello() {System.out.println("hello");}
}
输出结果打电话发短信

原因:两把锁锁的不是同一个东西

小解

new 出来的 this 是具体的一个对象

static Class 是唯一的一个模板

相关文章:

JUC并发编程-8锁现象

5. 8锁现象 如何判断锁的是谁!锁到底锁的是谁? 锁会锁住:对象、Class 深刻理解我们的锁 问题1 两个同步方法,先执行发短信还是打电话 public class dome01 {public static void main(String[] args) {Phone phone new Phon…...

集美大学“第15届蓝桥杯大赛(软件类)“校内选拔赛 D矩阵选数

经典的状态压缩DP int dp[15][(1<<14)10]; int a[15][15]; void solve() {//dp[i][st]考虑到了第i行 并且当前考虑完第i行以后的选择状态是st的所有方案中的最大值for(int i1;i<13;i)for(int j1;j<13;j)cin>>a[i][j];for(int i1;i<13;i){for(int j0;j<…...

Android System Service系统服务--1

因为工作中经常需要解决一些framework层的问题&#xff0c;而framework层功能一般都是system service 的代理stub&#xff0c;然后封装相关接口&#xff0c;并提供给APP层使用&#xff0c;system service则在不同的进程中运行&#xff0c;这样实现了分层&#xff0c;隔离&#…...

【RT-DETR有效改进】华为 | Ghostnetv1一种专为移动端设计的特征提取网络

前言 大家好&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持ResNet32、ResNet101和PP…...

45个经典Linux面试题!赶紧收藏!

问题一&#xff1a; 绝对路径用什么符号表示&#xff1f;当前目录、上层目录用什么表示&#xff1f;主目录用什么表示? 切换目录用什么命令&#xff1f; 答案&#xff1a;绝对路径&#xff1a;如/etc/init.d当前目录和上层目录&#xff1a;./ …/主目录&#xff1a;~/切换目…...

将字符串中可能被视为正则表达式的特殊字符进行转义re.escape()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将字符串中可能被视为 正则表达式的特殊字符 进行转义 re.escape() [太阳]选择题 请问以下代码最后输出的结果是&#xff1f; import re s [a-z] print("【显示】s ",s) print(&q…...

C语言:函数指针的使用

在C语言中&#xff0c;函数指针是指向函数的指针变量。它可以存储函数的地址&#xff0c;使得可以通过该指针来调用函数。以下是函数指针的基本概念和用法&#xff1a; 一、基本概念&#xff1a; 声明函数指针&#xff1a; returnType (*pointerName)(parameterTypes); 这里 r…...

「实战应用」如何用DHTMLX Gantt构建类似JIRA式的项目路线图(二)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 在web项目中使用DHTMLX Gantt时&#xff0c;开发人员经常需要满足与UI外观相关的各种需求。因此他们必须确定JavaScript甘特图库的…...

Webpack5入门到原理18:Plugin 原理

Plugin 的作用 通过插件我们可以扩展 webpack&#xff0c;加入自定义的构建行为&#xff0c;使 webpack 可以执行更广泛的任务&#xff0c;拥有更强的构建能力。 Plugin 工作原理 webpack 就像一条生产线&#xff0c;要经过一系列处理流程后才能将源文件转换成输出结果。 这条…...

PWM之舵机

舵机又称直流电机&#xff0c;如下图 本节承接上节&#xff0c;具体的PWM技术已经在上一节讲的很详细了&#xff0c;本节就不再讲了&#xff0c;那么我们的重点就放在直流电机的工作原理上了。 一、工作原理 我们研究直流电机&#xff0c;主要式研究直流电机旋转速度的调节&a…...

Python并发与多线程:IO并发(阻塞IO、非阻塞IO、IO多路复用、异步IO)

在Python中&#xff0c;有多种处理并发的方式&#xff0c;其中之一就是使用多线程进行IO并发操作。在IO操作中&#xff0c;有四种常见的方式&#xff1a;阻塞IO、非阻塞IO、IO多路复用和异步IO。 阻塞IO&#xff08;Blocking IO&#xff09;&#xff1a;当执行一个IO操作时&…...

React16源码: React中的IndeterminateComponent的源码实现

IndeterminateComponent 1 &#xff09;概述 这是一个比较特殊的component的类型&#xff0c; 就是还没有被指定类型的component在一个fibrer被创建的时候&#xff0c;它的tag可能会是 IndeterminateComponent在 packages/react-reconciler/src/ReactFiber.js 中&#xff0c;有…...

SpringBoot:详解Bean生命周期和作用域

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、生命周期二…...

【图解数据结构】顺序表实战指南:手把手教你详细实现(超详细解析)

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;图解数据结构、算法模板 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️线性表1.1 &#x1f514;线性表的定义1.2 &#x1f514;线性表的存储结构 二. ⛳️顺序表…...

WordPress怎么禁用文章和页面古腾堡块编辑器?如何恢复经典小工具?

现在下载WordPress最新版来搭建网站&#xff0c;默认的文章和页面编辑器&#xff0c;以及小工具都是使用古腾堡编辑器&#xff08;Gutenberg块编辑器&#xff09;。虽然有很多站长说这个编辑器很好用&#xff0c;但是仍然有很多站长用不习惯&#xff0c;觉得操作太难了&#xf…...

【HarmonyOS】掌握布局组件,提升应用体验

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…...

第4周:Pytorch——综合应用和实战项目 Day 28-30: 学习资源和社区参与

第4周&#xff1a;综合应用和实战项目 Day 28-30: 学习资源和社区参与 在这个阶段&#xff0c;我们将探索更多的学习资源并鼓励参与PyTorch和TensorFlow的社区&#xff0c;以进一步提升技术和融入开发者社群。 学习资源&#xff1a; 论文&#xff1a;阅读最新的机器学习和深度…...

TypeScript教程(一)在vscode中的配置TypeScript环境

TypeScript教程&#xff08;一&#xff09;在vscode中的配置TypeScript环境 文章目录 TypeScript教程&#xff08;一&#xff09;在vscode中的配置TypeScript环境一、前言二、具体步骤1、Node.js安装2、TypeScript安装3、helloworld 一、前言 未来的开发者们请上座&#xff0c…...

sshpass的安装与使用

一.简介 1.定义&#xff1a; ssh 登陆不能在命令行中指定密码&#xff0c;sshpass 的出现则解决了这一问题。它允许你用 -p 参数指定明文密码&#xff0c;然后直接登录远程服务器&#xff0c;它支持密码从命令行、文件、环境变量中读取。 2.使用 sshpass 原因 使用 sshpass…...

Excel·VBA合并工作簿2

其他合并工作簿的方法&#xff0c;见之前的文章《ExcelVBA合并工作簿》 目录 8&#xff0c;合并文件夹下所有工作簿中所有工作表&#xff0c;按表头汇总举例 8&#xff0c;合并文件夹下所有工作簿中所有工作表&#xff0c;按表头汇总 与之前的文章《ExcelVBA合并工作簿&#x…...

C语言入门:了解历史与适用人群

要是您身为一名刚开始接触学习事物的人&#xff0c;再者您尚未弄明白何种属于编程语言&#xff0c;那就去瞧瞧这个了&#xff1a;什么是编程语言。 若您先前未曾接触过任何一种编程语言&#xff0c;或者您并不明白为何要是学习C语言来着&#xff0c;请看&#xff1a;为什么C语言…...

如何用浏览器扩展将网页内容一键转换为AI知识库

如何用浏览器扩展将网页内容一键转换为AI知识库 【免费下载链接】anything-llm 这是一个全栈应用程序&#xff0c;可以将任何文档、资源&#xff08;如网址链接、音频、视频&#xff09;或内容片段转换为上下文&#xff0c;以便任何大语言模型&#xff08;LLM&#xff09;在聊天…...

Czkawka磁盘清理工具:通过多线程哈希技术实现300%扫描效率提升

Czkawka磁盘清理工具&#xff1a;通过多线程哈希技术实现300%扫描效率提升 【免费下载链接】czkawka 一款跨平台的重复文件查找工具&#xff0c;可用于清理硬盘中的重复文件、相似图片、零字节文件等。它以高效、易用为特点&#xff0c;帮助用户释放存储空间。 项目地址: htt…...

逐行Hybrid A*路径规划与混合A星泊车路径规划的源码分析(MATLAB版)

逐行hybrid astar路径规划 混合a星泊车路径规划 带你从头开始写hybridastar算法&#xff0c;逐行源码分析matlab版hybridastar算法咱们今天唠唠混合A星&#xff08;Hybrid A*&#xff09;路径规划&#xff0c;这玩意儿在自动泊车场景用得贼溜。和传统A星最大的区别在于它能处理…...

OpenClaw+GLM-4.7-Flash智能邮件分类:自动识别优先级与回复草稿

OpenClawGLM-4.7-Flash智能邮件分类&#xff1a;自动识别优先级与回复草稿 1. 为什么我需要智能邮件助手 每天早晨打开邮箱时&#xff0c;我的收件箱总是堆满未读邮件——客户咨询、会议邀请、系统通知、订阅推送混杂在一起。手动分类需要花费20-30分钟&#xff0c;而最让我头…...

IDM激活的3种方案:兼容Win7-11的终极解决方案

IDM激活的3种方案&#xff1a;兼容Win7-11的终极解决方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 问题引入&#xff1a;IDM试用期到期的烦恼 Internet D…...

毕业设计实战:基于SpringBoot的网购平台管理系统设计与实现全攻略

毕业设计实战&#xff1a;基于SpringBoot的网购平台管理系统设计与实现全攻略 在开发“基于SpringBoot的网购平台管理系统”毕业设计时&#xff0c;曾因“订单状态与库存管理脱节”踩过关键坑——初期未设计清晰的订单状态机和库存联动机制&#xff0c;导致用户下单后库存未及时…...

ELK+Metricbeat搭建服务器监控看板:CPU/内存/磁盘全搞定

ELKMetricbeat实战&#xff1a;打造企业级服务器监控看板 当服务器集群规模超过50台时&#xff0c;凌晨三点被电话叫醒处理性能问题的运维人员&#xff0c;最需要的不是咖啡&#xff0c;而是一套能实时呈现CPU、内存、磁盘等关键指标的智能监控系统。本文将手把手带您用ELK Sta…...

用ESP32-S3给OV2640摄像头上‘网课’:手把手实现低延迟MJPEG监控系统

基于ESP32-S3与OV2640构建低延迟MJPEG监控系统的工程实践 在物联网和边缘计算领域&#xff0c;实时视频监控系统的需求日益增长。本文将深入探讨如何利用ESP32-S3微控制器和OV2640摄像头模组构建一个完整的低延迟MJPEG监控系统&#xff0c;从硬件连接到软件优化&#xff0c;全…...

QWEN-AUDIO应用案例:如何制作一个会讲故事的AI语音玩具

QWEN-AUDIO应用案例&#xff1a;如何制作一个会讲故事的AI语音玩具 1. 项目背景与创意来源 1.1 儿童教育市场的语音需求 在当今儿童教育领域&#xff0c;互动性和趣味性成为产品设计的关键要素。传统的故事机往往只能播放预录制的音频内容&#xff0c;缺乏个性化和互动能力。…...