多线程锁-8锁案例编码演示

news/2024/10/29 5:33:28/

3.2 通过8种情况演示锁运行案例,看看锁到底是什么

3.2.1 锁相关的8种案例演示code

1.标准访问ab两个线程,请问先打印邮件还是短信?

package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit;/*** @author zhou*///资源类,口诀:线程操作资源类
class Phone {public synchronized void sendEmail() {System.out.println("------sendEmail");}public synchronized void sendSMS() {System.out.println("------sendSMS");}}public class Lock8Demo {public static void main(String[] args) {Phone phone = new Phone();new Thread(() -> {phone.sendEmail();},"A").start();//暂停毫秒,保证A线程先启动try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() -> {phone.sendSMS();}, "B").start();//1 标准访问ab两个线程,请问先打印邮件还是短信?/*------sendEmail------sendSMS*///先邮件,后短信  共用一个对象锁}
}

2. sendEmail钟加入暂停3秒钟,请问先打印邮件还是短信? 

package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit;/*** @author zhou*///资源类,口诀:线程操作资源类
class Phone {public synchronized void sendEmail() {//暂停3秒钟try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("------sendEmail");}public synchronized void sendSMS() {System.out.println("------sendSMS");}}public class Lock8Demo {public static void main(String[] args) {Phone phone = new Phone();new Thread(() -> {phone.sendEmail();},"A").start();//暂停毫秒,保证A线程先启动try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() -> {phone.sendSMS();}, "B").start();//2. sendEmail钟加入暂停3秒钟,请问先打印邮件还是短信?/*------sendEmail------sendSMS*///依然是先邮件,后短信  共用一个对象锁}
}

3. 添加一个普通的hello方法,请问先打印普通方法还是邮件?

package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit;/*** @author zhou*///资源类,口诀:线程操作资源类
class Phone {public synchronized void sendEmail() {//暂停3秒钟try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("------sendEmail");}public synchronized void sendSMS() {System.out.println("------sendSMS");}public void hello(){System.out.println("------hello");}}public class Lock8Demo {public static void main(String[] args) {Phone phone = new Phone();new Thread(() -> {phone.sendEmail();},"A").start();//暂停200毫秒,保证A线程先启动try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() ->{phone.hello();},"B").start();//3. 添加一个普通的hello方法,请问先打印普通方法还是邮件?/*------hello------sendEmail*///程序执行在sendEmail()中锁了并在方法中睡3秒,外部在睡200毫秒后调用hello(),因为无锁因此直接执行}
}

4. 有两部手机,请问先打印邮件还是短信? 

package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit;/*** @author zhou*///资源类,口诀:线程操作资源类
class Phone {public synchronized void sendEmail() {//暂停3秒钟try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("------sendEmail");}public synchronized void sendSMS() {System.out.println("------sendSMS");}}public class Lock8Demo {public static void main(String[] args) {Phone phone = new Phone();Phone phone2 = new Phone();new Thread(() -> {phone.sendEmail();},"A").start();//暂停200毫秒,保证A线程先启动try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() ->{phone2.sendSMS();},"B").start();//4. 有两部手机,请问先打印邮件还是短信?/*------sendSMS------sendEmail*///程序调用sendEmail()时锁住phone,外部睡1秒后调用sendSMS()时锁phone2,互不影响}
}

5. 有两个静态同步方法,一步手机, 请问先打印邮件还是短信? 

package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit;/*** @author zhou*///资源类,口诀:线程操作资源类
class Phone {public static synchronized void sendEmail() {//暂停3秒钟try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("------sendEmail");}public static synchronized void sendSMS() {System.out.println("------sendSMS");}}public class Lock8Demo {public static void main(String[] args) {Phone phone = new Phone();new Thread(() -> {phone.sendEmail();},"A").start();//暂停200毫秒,保证A线程先启动try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() ->{phone.sendSMS();},"B").start();//5. 有两个静态同步方法,一步手机, 请问先打印邮件还是短信?/*------sendEmail------sendSMS*///这里多了静态static,因此此时锁的东西改变了,sendEmail()和sendSMS()都是锁的Phone这个class,//程序在执行sendEmail()时锁住Phone class,睡200毫秒后调用sendSMS(),sendSMS()等待sendEmail()内睡完释放锁后再执行}
}

6. 有两个静态同步方法,两部手机, 请问先打印邮件还是短信? 

package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit;/*** @author zhou*///资源类,口诀:线程操作资源类
class Phone {public static synchronized void sendEmail() {//暂停3秒钟try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("------sendEmail");}public static synchronized void sendSMS() {System.out.println("------sendSMS");}}public class Lock8Demo {public static void main(String[] args) {Phone phone = new Phone();Phone phone2 = new Phone();new Thread(() -> {phone.sendEmail();},"A").start();//暂停200毫秒,保证A线程先启动try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() ->{phone2.sendSMS();},"B").start();//6. 有两个静态同步方法,两部手机, 请问先打印邮件还是短信?/*------sendEmail------sendSMS*///要注意的是,不管现在new结果对象,调用方法后锁的都是Phone class,sendSMS()会被sendEmail()阻塞}
}

7. 有一个静态同步方法 一个普通同步方法,1部手机,请问先打印邮件还是短信? 

package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit;/*** @author zhou*///资源类,口诀:线程操作资源类
class Phone {public static synchronized void sendEmail() {//暂停3秒钟try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("------sendEmail");}public synchronized void sendSMS() {System.out.println("------sendSMS");}}public class Lock8Demo {public static void main(String[] args) {Phone phone = new Phone();new Thread(() -> {phone.sendEmail();},"A").start();//暂停200毫秒,保证A线程先启动try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() ->{phone.sendSMS();},"B").start();//7. 有一个静态同步方法 一个普通同步方法,1部手机,请问先打印邮件还是短信?/*------sendSMS------sendEmail*///同样只要确认锁的是不是一个东西就知道会不会阻塞,调用sendEmail()时阻塞的是Phone class,调用sendSMS()时阻塞的是phone}
}

8. 有一个静态同步方法,一个普通同步方法,两部手机,请问先打印邮件还是短信? 

package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit;/*** @author zhou*///资源类,口诀:线程操作资源类
class Phone {public static synchronized void sendEmail() {//暂停3秒钟try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("------sendEmail");}public synchronized void sendSMS() {System.out.println("------sendSMS");}}public class Lock8Demo {public static void main(String[] args) {Phone phone = new Phone();Phone phone2 = new Phone();new Thread(() -> {phone.sendEmail();},"A").start();//暂停200毫秒,保证A线程先启动try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}new Thread(() ->{phone2.sendSMS();},"B").start();//8. 有一个静态同步方法,一个普通同步方法,两部手机,请问先打印邮件还是短信?/*------sendSMS------sendEmail*///解题跟7一致,调用sendEmail()时阻塞的是Phone class,调用sendSMS()时阻塞的是phone2,一个类锁一个对象锁}
}

​​分析:

结论:

1.对于普通同步方法,锁的是当前实例对象,通常指this,所有的同步方法用的

都是同一把锁--->实例对象本身

2.对于静态同步方法,锁的时当前类的Class对象

3.对于同步方法块,锁的时synchronized括号内的对象

多线程8锁问题-CSDN博客

线程八锁-CSDN博客​​​​​​​


http://www.ppmy.cn/news/1142045.html

相关文章

在原生html中使用less

引入less <link rel"stylesheet/less" href"./lessDemo.less" /><script src"./js/less.min.js"></script> less.min.js文件下载地址:https://github.com/less/less.js 注意&#xff1a;less文件在前&#xff0c;js文件在后…

光伏发电预测(GRU模型,Python代码)

运行效果&#xff1a;光伏发电预测&#xff08;GRU模型&#xff0c;Python代码&#xff09;_哔哩哔哩_bilibili 所有库的版本&#xff1a; 1.数据集&#xff08;连续10年不间断采集三个光伏电站的发电量及天气情况&#xff0c;每隔半个小时采集一次信息&#xff0c;因此&…

【案例】从kaggle的房价预测模型案例中了解深度学习模型,即如何学习深度学习模型

1、背景 深度学习是什么&#xff0c;为了解决什么样的问题 深度学习是一种机器学习的方法&#xff0c;它的主要目的是从数据中自动学习到有效的特征表示。深度学习通过多层的特征转换&#xff0c;把原始数据变成更高层次、更抽象的表示。这些学习到的表示可以替代人工设计的…

怎样给Ubuntu系统安装vmware-tools

首先我要告诉你&#xff1a;Ubuntu无法安装vmware-tools&#xff0c;之所以这么些是因为我一开始也是这样认为的&#xff0c;vmware-tools是给Windows系统准备的我认为&#xff0c;毕竟Windows占有率远远高于Linux&#xff0c;这也可以理解。 那么怎么样实现Ubuntu虚拟机跟Wind…

微信小程序 rpx 转 px

前言 略 rpx 转 px let query wx.createSelectorQuery(); query.selectViewport().boundingClientRect(function(res){let rpx2Px 1 * (res.width/750);console.log("1rpx " rpx2Px "px"); }); query.exec();参考 https://blog.csdn.net/qq_39702…

ArduPilot开源飞控之AP_Baro

ArduPilot开源飞控之AP_Baro 1. 源由2&#xff0c;框架设计2.1 启动代码2.2 任务代码 AP_Baro::update2.3 任务代码 AP_Baro::accumulate2.4 任务代码 AP_TempCalibration::update 3. 重要例程3.1 AP_Baro::calibrate3.2 AP_TempCalibration3.2.1 AP_TempCalibration::setup_le…

单目标应用:猎豹优化算法(The Cheetah Optimizer,CO)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、猎豹优化算法CO 猎豹优化算法&#xff08;The Cheetah Optimizer&#xff0c;CO&#xff09;由MohammadAminAkbari等人于2022年提出&#xff0c;该算法性…

什么情况下设备的无线接收器会出现饱和和过载?

设备的无线接收器可能会在以下情况下饱和和过载&#xff1a; 1. 强信号输入&#xff1a;当设备接收到过强的信号时&#xff0c;接收器可能会超出其处理能力范围&#xff0c;导致饱和和过载。这通常发生在设备非常靠近路由器或者处于信号源附近时。 2. 多个信号源&#xff1a;…