8锁现象详解

如何判断锁的是谁!理解锁!锁到底锁的是谁!

对象、class   。

1.前两个问题

package com.kuang.lock8;import java.util.concurrent.TimeUnit;/*** 8锁 ,就是关于锁的8个问题* 1、标准情况下,两个线程先打印  发短信还是打电话? 1/发短信 2/打电话* 2、sendSms 延迟4秒,两个线程先打印  发短信还是 打电话 ? 1/发短信 2/打电话*/
public class Test1 {public static void main(String[] args) {Phone phone = new Phone();//锁的存在,才导致,它先执行。面试的适合,不能说是因为他先被调用,而是它先抢到了锁,所以它先打印!new Thread(()->{phone.sendSms();},"A").start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}new Thread(()->{phone.call();},"B").start();}}
class Phone{//synchronized 锁的对象是方法的调用者!  phone//两个方法用的是同一个锁,谁先拿到谁执行!public synchronized void  sendSms(){try {TimeUnit.SECONDS.sleep(4);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("sendSms");}public synchronized void call(){System.out.println("call");}}

2.3-4问题

package com.kuang.lock8;import java.util.concurrent.TimeUnit;/*** 8锁 ,就是关于锁的8个问题** 3.增加了一个普通方法! 发短信还是Hello?   是hello.* 4. 两个对象,两个同步方法! 发短信还是打电话?   是打电话*/
public class Test2 {public static void main(String[] args) {//两个对象 ,两个调用者 ,两把锁!Phone2 phone1 = new Phone2();Phone2 phone2 = new Phone2();//锁的存在,才导致,它先执行。面试的适合,不能说是因为他先被调用,而是它先抢到了锁,所以它先打印!new Thread(()->{phone1.sendSms();},"A").start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}new Thread(()->{phone2.hello();},"B").start();}}
class Phone2{//synchronized 锁的对象是方法的调用者!  phone//两个方法用的是同一个锁,谁先拿到谁执行!public synchronized void  sendSms(){try {TimeUnit.SECONDS.sleep(4);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("sendSms");}public synchronized void call(){System.out.println("call");}//这里没有锁!不是同步方法,不受锁的影响!public void hello(){System.out.println("hello");}}

3.5-6

package com.kuang.lock8;import java.util.concurrent.TimeUnit;/*** 8锁 ,就是关于锁的8个问题** 5.增加两个静态同步方法,只有一个对象,先打印,发短信?打电话? 打印发短信!!因为锁的都是同一个class对象* 6.增加两个对象,两个静态的同步方法,先打印,发短信?打电话? 打印发短信!!  因为锁的都是同一个class对象,与对象本身无关*/
public class Test3 {public static void main(String[] args) {//两个对象的class 类模板只有一个,static,锁的是classPhone3 phone1 = new Phone3();Phone3 phone2 = new Phone3();//锁的存在,才导致,它先执行。面试的适合,不能说是因为他先被调用,而是它先抢到了锁,所以它先打印!new Thread(()->{phone1.sendSms();},"A").start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}new Thread(()->{phone2.call();},"B").start();}}
//Phone3唯一的一个Class对象
class Phone3{//synchronized 锁的对象是方法的调用者!  phone//两个方法用的是同一个锁,谁先拿到谁执行!//static  静态方法//类一加载就有了!锁的Class 锁的是模板public static synchronized void  sendSms(){try {TimeUnit.SECONDS.sleep(4);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("sendSms");}public static synchronized void call(){System.out.println("call");}}

4.第7个问题

package com.kuang.lock8;import java.util.concurrent.TimeUnit;/*** 8锁 ,就是关于锁的8个问题** 7. 1个静态的同步方法,1个普通的同步方法,1个对象 ,先打印发短信?还是打电话? 打电话,因为锁的不是同一个东西,而打电话的睡眠时间少,所以打电话先打印**/
public class Test4 {public static void main(String[] args) {//两个对象的class 类模板只有一个,static,锁的是classPhone4 phone = new Phone4();//锁的存在,才导致,它先执行。面试的适合,不能说是因为他先被调用,而是它先抢到了锁,所以它先打印!new Thread(()->{phone.sendSms();},"A").start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}new Thread(()->{phone.call();},"B").start();}}
//Phone3唯一的一个Class对象
class Phone4{//静态的同步方法public static synchronized void  sendSms(){try {TimeUnit.SECONDS.sleep(4);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("sendSms");}//普通的同步方法public synchronized void call(){System.out.println("call");}}

5.8-9个问题

package com.kuang.lock8;import java.util.concurrent.TimeUnit;/*** 8锁 ,就是关于锁的8个问题** 8. 1个静态的同步方法,1个普通的同步方法,2个对象 ,先打印发短信?还是打电话? 打电话,因为锁的不是同一个东西,而打电话的睡眠时间少,所以打电话先打印* 9. 如何让静态方法与 普通方法实现同步,用 synchronized 在普通方法里 锁住 字节码对象,就可以实现同步  然后就是发短信先打印了**/
public class Test5 {public static void main(String[] args) {//两个对象的class 类模板只有一个,static,锁的是classPhone5 phone1 = new Phone5();Phone5 phone2 = new Phone5();//锁的存在,才导致,它先执行。面试的时候,不能说是因为他先被调用,而是它先抢到了锁,所以它先打印!new Thread(()->{phone1.sendSms();},"A").start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}new Thread(()->{phone2.call();},"B").start();}}
//Phone3唯一的一个Class对象
class Phone5{//静态的同步方法public static synchronized void  sendSms(){try {TimeUnit.SECONDS.sleep(4);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("sendSms");}//普通的同步方法public  void call(){synchronized(Phone5.class){System.out.println("call");}}}

加拓展 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/110114.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录crack某IDE插件过程

声明:本文仅记录学习过程,已对关键位置脱敏处理,未提供任何工具,请支持正版。 反编译jar包 使用cfr进行对插件核心jar包MyBxxxxxx-obfuss.jar进行反编译,在本地生成a.txt。 java -jar cfr-0.152.jar MyBxxxx-obfuss.…

【Linux从入门到精通】多线程 | 线程互斥(互斥锁)

上篇文章我们对线程 | 线程介绍&线程控制介绍后,本篇文章将会对多线程中的线程互斥与互斥锁的概念进行详解。同时结合实际例子解释了可重入与不被重入函数、临界资源与临界区和原子性的概念。希望本篇文章会对你有所帮助。 文章目录 引入 一、重入与临界 1、1 可…

无涯教程-JavaScript - ASIN函数

描述 ASIN函数返回给定数字的反正弦或反正弦,并返回以弧度表示的Angular,介于-π/2和π/2之间。 语法 ASIN (number)争论 Argument描述Required/OptionalNumberThe sine of the angle you want and must be from -1 to 1.Required Notes 如果您希望ASIN函数返回的Angular以…

log4j2 日志保存至数据库

文章目录 概述一、springmvc工程1.创建数据库日志表2.log4j2.xml引入JDBCAppender3.定义日志管理类4.编写日志输出代码5.运行结果6.完整代码 二、springboot工程1. 创建数据库日志表2.log4j2.xml引入JDBCAppender3.定义日志管理类4. 遗留问题5. 解决办法6. 完整代码 概述 Apac…

初识 Linux 文件系统

初识 Linux 文件系统 如果是刚接触 Linux 系统,可能就很难搞清楚 Linux 如何引用文件和目录。对于对已经习惯 使用 Windows 操作系统的人来说,难度更大。所以要想学习 Linux 系统,就必须先了解 Linux 文件系统 文章目录 初识 Linux 文件系统…

icmp报文及用go实现

目录 一、概述 二、ICMP报文格式详解 2.1 什么是ICMP 2.2 ICMP报文格式 2.3 ICMP报文类型 2.4 实际报文举例 三、使用go实现icmp请求以及接收响应内容 一、概述 本文主要旨在学习icmp报文格式,以及通过go语言来实现ICMP发包。 二、ICMP报文格式详解 2.1 什…

SpringMVC之JSR303和拦截器

认识JSR303 JSR303是一项Java标准规范,也叫做Bean Validation规范,提供了一种JavaBean数据验证的规范方式。在SpringMVC中,可以通过引入JSR303相关的依赖,来实现数据的校验。 在使用JSR303进行校验时,需要在需要校验的…

ETL与ELT理解

ETL ETL( Extract-Transform-Load),用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程。ETL模式适用于小数据量集。如果在转换过程…

回溯算法解决分割回文串

回溯算法解分割回文串 力扣131 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1: 输入:s "aab" 输出&#xff1…

安防监控视频系统EasyCVR+AI算法智能分析网关助力智慧校园建设

学生是祖国的未来,学校就是培育学生的地方。随着校园信息化建设的不断发展,信息服务在校园管理中的作用也越来越强。在保障学生安全与校园高效管理上,人工智能做出了极大贡献,旭帆科技安防监控系统/视频汇聚/云存储/AI智能视频分析…

mysql的索引分类

索引分类 在 MySQL 数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。 分类 含义 特点 关键字 主键 索引 针对于表中主键创建的索引 默认自动创建 , 只能 有一个 PRIMARY 唯一 索引 避免同一个表中某数据列中…

多线程|多进程|高并发网络编程

一.多进程并发服务器 多进程并发服务器是一种经典的服务器架构,它通过创建多个子进程来处理客户端连接,从而实现并发处理多个客户端请求的能力。 概念: 服务器启动时,创建主进程,并绑定监听端口。当有客户端连接请求…