8个锁相关问题

news/2025/1/25 8:25:03/

1、8个锁问题

(1)问题

1)标准访问,先打印短信还是邮件。
2)停4秒在短信方法内,先打印短信还是邮件。
3)普通的hello方法,是先打短信还是hello。
4)现在有两部手机,先打印短信还是邮件。
5)两个静态同步方法,1部手机,先打印短信还是邮件。
6)两个静态同步方法,2部手机,先打印短信还是邮件。
7)1个静态同步方法,1个普通同步方法,1部手机,先打印短信还是邮件。
8)1个静态同步方法,1个普通同步方法,2部手机,先打印短信还是邮件。

(2)代码

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();}
}

(3)运行答案

1)短信
2)短信
3) Hello
4) 邮件
5) 短信
6) 短信
7) 邮件
8) 邮件

2、相关分析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

所有的静态同步方法用的也是同一把锁——类对象本身,这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞态条件的。

但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象!

3、代码

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();}
}

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

相关文章

Honeywell EPKS通用中文操作手册 (续)

Document Name Honeywell EPKS通用中文操作手册 Version 0_01 Status Approved Date March 21, 2022 Subject Technical Materials 免责声明 该文件包含霍尼韦尔专有信息。本文件所包…

《C++ Primer》--学习11

关联容器中的元素是按关键字来保存和访问的 两个主要的关联容器类型是 map 和 set。map 中的一个关键字-值(key - value)对:关键字起到索引作用,值则表示与索引相关联的数据。set 中每个元素只包含一个关键字; 以下八…

enote笔记法之附录1——“语法词”(即“关联词”)(ver0.23)

enote笔记法之附录1——“语法词”(即“关联词”)(ver0.23) 最上面的是截屏的完整版,分割线下面的是纯文字版本: 作者姓名(本人的真实姓名):胡佳吉 居住地&#xff1…

最新江苏安全员C考试多选练习题库

题库来源:【学视线】公众号提供安全员C考试试题、安全员考试预测题、安全员C考试真题、安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 151.爆破作业环境有下列()情记时,不应进行爆破作业。 A.爆破可能产生不稳定边城…

在线考试管理系统

在线考试管理系统--------专业实习记录(一) 毕业实习任务是完成一个在线考试管理系统,分为前端和后端,前端主要用htmlbootstrap模板、jQuery、ajax,后端主要用java、springboot、mybatis、mysql。 电脑环境&#xff1…

2021年安全员-C证(山东省-2021版)考试及安全员-C证(山东省-2021版)考试APP

题库来源:安全生产模拟考试一点通公众号小程序 安全员-C证(山东省-2021版)考试是由公众号安全生产模拟考试一点通提供,安全员-C证(山东省-2021版)证模拟考试题库是根据安全员-C证(山东省-2021版…

全国计算机等级考试-数据库四级备考资料

这个考试非常理论,分为数据库技术和操作系统两部分,每部分50分,各超过30分合格。考试中我遇到的大部分是原题,小部分没见过,整体不难,在市场上也没什么认可度,好在便宜,需要资料可自…

温州医科大学oracle期末试题,关于加强试卷库试题库建设的通知

关于加强试卷库试题库建设的通知 温医教〔2005〕89号 各学院(部): 为了加强我校考试工作的规范化建设与管理,进一步促进教学质量的提高,促进学风和教风建设,实现考试的科学化、规范化,为学分制的实施、考教分离奠定良好的基础&…