如何判断锁的是谁? 永远知道是什么锁,

线程8锁:就是关于锁的8个问题

问题1:

public class LockDemo01 {
public static void main(String[] args) throws InterruptedException {
//8 锁--1
//资源类
Phone phone = new Phone(); new Thread(()->{ phone.sendMes();},"A").start(); //这里睡1 秒, 保证线程B 能抢到执行权
TimeUnit.SECONDS.sleep(1); new Thread(()->{ phone.call(); },"B").start(); //问: 此时是先打印: 发信息? 还是打电话,
//答: 先信息, 后打电话 因为资源类中的二个方法 都是 synchronized 修饰的, 他锁的是方法的调用者,由于调用者都是phone, 同一个调用者,所以谁先拿到锁,谁先执行
}
} //资源类
class Phone{
//发短信
public synchronized void sendMes(){
//这里睡4秒
try {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短消息");
} catch (InterruptedException e) {
e.printStackTrace();
}
} //打电话
public synchronized void call(){
System.out.println("打电话");
} }

问题2: 资源类中的 call()方法是普通方法, sendMes()是synchronized修饰的, 此时打印结果是什么? 谁先执行?, 答案是: 打电话, 发信息

public class LockDemo01 {
public static void main(String[] args) throws InterruptedException {
//8 锁--1
//资源类
Phone phone = new Phone(); new Thread(()->{ phone.sendMes();},"A").start(); //这里睡1 秒, 保证线程B 能抢到执行权
TimeUnit.SECONDS.sleep(1); new Thread(()->{ phone.call(); },"B").start(); //问: 此时是先打印: 发信息? 还是打电话,
//答: 打电话 发信息 因为资源类sendMes()是 synchronized修饰,锁对象是调用者, call()是普通方法, 线程调用互不影响,
}
} //资源类
class Phone{
//发短信
public synchronized void sendMes(){
//这里睡4秒
try {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短消息");
} catch (InterruptedException e) {
e.printStackTrace();
}
} //打电话
public void call(){
System.out.println("打电话");
} }

问题3: 资源类中的二个方法都是 synchronized修饰的, 此时有二个调用者,谁先执行? 结果为什么?

public class LockDemo01 {
public static void main(String[] args) throws InterruptedException {
//8 锁--1
//资源类
Phone phone1 = new Phone();
Phone phone2 = new Phone(); new Thread(()->{ phone1.sendMes();},"A").start(); //这里睡1 秒, 保证线程B 能抢到执行权
TimeUnit.SECONDS.sleep(1); new Thread(()->{ phone2.call(); },"B").start(); //问: 此时是先打印: 发信息? 还是打电话,
//答: 打电话 发短信 因为资源类中的二个方法 都是 synchronized 修饰的, 他锁的是方法的调用者,由于调用者是二个, 二把锁, 互不干扰 ,
}
} //资源类
class Phone{
//发短信
public synchronized void sendMes(){
//这里睡4秒
try {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短消息");
} catch (InterruptedException e) {
e.printStackTrace();
}
} //打电话
public synchronized void call(){
System.out.println("打电话");
} }

问题4: 资源类中的二个方法都是 static synchronized修饰的, 此时同一个调用者, 结果先打印谁?

public class LockDemo01 {
public static void main(String[] args) throws InterruptedException {
//8 锁--1
//资源类
Phone phone = new Phone(); new Thread(()->{ phone.sendMes();},"A").start(); //这里睡1 秒, 保证线程B 能抢到执行权
TimeUnit.SECONDS.sleep(1); new Thread(()->{ phone.call(); },"B").start(); //问: 此时是先打印: 发信息? 还是打电话,
//答: 发短信 打电话 因为资源类中的二个方法 都是 synchronized static 修饰的静态同步类,是在类加载的时候就有了锁,锁的是同一个class,所以这个锁,谁先拿到,谁先执行 }
} //资源类
class Phone{
//发短信
public static synchronized void sendMes(){
//这里睡4秒
try {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短消息");
} catch (InterruptedException e) {
e.printStackTrace();
}
} //打电话
public static synchronized void call(){
System.out.println("打电话");
} }

问题5: 资源类中的二个方法都是 static synchronized修饰的, 此时二个调用者, 结果先打印谁?

public class LockDemo01 {
public static void main(String[] args) throws InterruptedException {
//8 锁--1
//资源类
Phone phone1 = new Phone();
Phone phone2 = new Phone(); new Thread(()->{ phone1.sendMes();},"A").start(); //这里睡1 秒, 保证线程B 能抢到执行权
TimeUnit.SECONDS.sleep(1); new Thread(()->{ phone2.call(); },"B").start(); //问: 此时是先打印: 发信息? 还是打电话,
//答: 发短信 打电话 因为资源类中的二个方法 都是 synchronized static 修饰的静态同步方法,是在类加载的时候就有了锁,锁对象是class, 此时不管多少个调用者,所以这个锁,谁先拿到,谁先执行 }
} //资源类
class Phone{
//发短信
public static synchronized void sendMes(){
//这里睡4秒
try {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短消息");
} catch (InterruptedException e) {
e.printStackTrace();
}
} //打电话
public static synchronized void call(){
System.out.println("打电话");
} }

问题6:资源类的方法,一个是 static synchronized 修饰的静态同步方法, 一个是synchronized 修饰, 同一个调用者, 此时谁先打印??

public class LockDemo01 {
public static void main(String[] args) throws InterruptedException {
//资源类
Phone phone = new Phone(); new Thread(()->{ phone.sendMes();},"A").start(); //这里睡1 秒, 保证线程B 能抢到执行权
TimeUnit.SECONDS.sleep(1); new Thread(()->{ phone.call(); },"B").start(); //问: 此时是先打印: 发信息? 还是打电话,
//答: 打电话 发短信 ,因为资源类中sednMes()是静态同步方法,锁的是class对象, call()方法是普通同步方法,锁的是调用者,相当于二把锁,互不干扰,sendMes,睡的时间长,所以后打印 }
} //资源类
class Phone{
//发短信
public static synchronized void sendMes(){
//这里睡4秒
try {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短消息");
} catch (InterruptedException e) {
e.printStackTrace();
}
} //打电话
public synchronized void call(){
System.out.println("打电话");
} }

问题7 资源类的方法,一个是 static synchronized 修饰的静态同步方法, 一个是synchronized 修饰, 有二个调用者, 此时谁先打印??

public class LockDemo01 {
public static void main(String[] args) throws InterruptedException {
//资源类
Phone phone1 = new Phone();
Phone phone2 = new Phone(); new Thread(()->{ phone1.sendMes();},"A").start(); //这里睡1 秒, 保证线程B 能抢到执行权
TimeUnit.SECONDS.sleep(1); new Thread(()->{ phone2.call(); },"B").start(); //问: 此时是先打印: 发信息? 还是打电话,
//答: 打电话 发短信 ,因为资源类中sednMes()是静态同步方法,锁的是class对象, call()方法是普通同步方法,锁的是调用者,相当于二把锁,互不干扰,sendMes,睡的时间长,所以后打印 }
} //资源类
class Phone{
//发短信
public static synchronized void sendMes(){
//这里睡4秒
try {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短消息");
} catch (InterruptedException e) {
e.printStackTrace();
}
} //打电话
public synchronized void call(){
System.out.println("打电话");
} }

JUC 并发编程--03, 深刻理解锁, 8 锁现象,的更多相关文章

  1. JUC 并发编程--12, 使用AtomicInteger 实现一把锁(排队自旋锁), 代码演示

    前面 使用自旋锁实现了一把锁,(请看 第5篇) volatile 三大特性: 可见性, 不保证原子性, 禁止指令重排 为了解决 volatile不保证原子性的问题, 引入了原子类, AtomicInt ...

  2. JUC并发编程学习笔记

    JUC并发编程学习笔记 狂神JUC并发编程 总的来说还可以,学到一些新知识,但很多是学过的了,深入的部分不多. 线程与进程 进程:一个程序,程序的集合,比如一个音乐播发器,QQ程序等.一个进程往往包含 ...

  3. JUC并发编程基石AQS之主流程源码解析

    前言 由于AQS的源码太过凝练,而且有很多分支比如取消排队.等待条件等,如果把所有的分支在一篇文章的写完可能会看懵,所以这篇文章主要是从正常流程先走一遍,重点不在取消排队等分支,之后会专门写一篇取消排 ...

  4. Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信

    Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...

  5. JUC并发编程基石AQS源码之结构篇

    前言 AQS(AbstractQueuedSynchronizer)算是JUC包中最重要的一个类了,如果你想了解JUC提供的并发编程工具类的代码逻辑,这个类绝对是你绕不过的.我相信如果你是第一次看AQ ...

  6. JUC : 并发编程工具类的使用

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.JUC是什么 1.JUC定义 JUC,即java.util.concurrent 在并发编程中使用的 ...

  7. JUC并发编程与高性能内存队列disruptor实战-上

    JUC并发实战 Synchonized与Lock 区别 Synchronized是Java的关键字,由JVM层面实现的,Lock是一个接口,有实现类,由JDK实现. Synchronized无法获取锁 ...

  8. JUC并发编程与高性能内存队列disruptor实战-下

    并发理论 JMM 概述 Java Memory Model缩写为JMM,直译为Java内存模型,定义了一套在多线程读写共享数据时(成员变量.数组)时,对数据的可见性.有序性和原子性的规则和保障:JMM ...

  9. java并发编程的艺术(一)---锁的基本属性

    本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...

随机推荐

  1. PKI/CA与证书服务

    目录 PKI CA RA LDAP目录服务 CRL证书作废系统 数字证书 证书验证 证书撤销 证书更新 PKI系统的构成 PKI PKI(Public Key Infrastructure)公钥基础设 ...

  2. POJ1698 最大流或者匈牙利

    题意:       一个人他有n个任务,每个任务都有一些限制:  (1)只能在一个星期中指定的日子去做,比如周1 2 6啥的  (2)总工作量有几天,就是一共要工作几天  (3)必须在几周之内完成,就 ...

  3. [CTF]Rabbit加密

    [CTF]Rabbit加密 ---------------------  作者:adversity`  来源:CSDN  原文:https://blog.csdn.net/qq_40836553/ar ...

  4. Java常见异常类型

    在Java学习过程中,我们会碰到各种各样的异常,现将面试过程中遇到的常见异常做一罗列并举例: 1.NullPointerException: 空指针异常.菜鸟编程经验发现这个异常是经常会发生的,属于运 ...

  5. Redis 集群伸缩原理

    Redis 节点分别维护自己负责的槽和对应的数据.伸缩原理:Redis 槽和对应数据在不同节点之间移动 环境:CentOS7 搭建 Redis 集群 一.集群扩容 1. 手动扩容 (1) 准备节点 9 ...

  6. SQL注入:Sqlmap初体验

    目录 sqlmap 安装 查看帮助文档 中文文档 直连数据库 服务型数据库(mysql) 文件型数据库(sqlite) 初级实战 1. 扫描注入点 2. 根据注入点查到全部数据库 --dbs 3. 根 ...

  7. Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2)

    A. Prison Break 题意:就是在一个n*m的矩阵中,以(1,1)为起点(n,m)为终点,每个点以每个单位1s的速度移动,问总共至少需要多少秒,所有的矩阵点就能够全部移动到(r,c)中 思路 ...

  8. Visual Lab Online —— Beta版本发布声明

    项目 内容 班级:北航2020春软件工程 博客园班级博客 作业:Beta阶段发布声明 发布声明 目录 发布方式.发布地址与运行环境要求 软件主体 浏览器扩展 Beta版本新功能 登录注册页 注册时邮箱 ...

  9. Beta——事后分析

    事后总结 NameNotFound 团队 项目 内容 北航-2020-软件工程(春季学期) 班级博客 要求 Beta事后分析 课程目标 通过团队合作完成一个软件项目的开发 会议截图 一.设想和目标 软 ...

  10. 如何对你的Linux系统进行基准测试: 3开源基准测试工具

    如何对你的Linux系统进行基准测试: 3开源基准测试工具   0 赞0 评论 文章标签:SYS  Source  benchmark  tool  开源  基准  系统     linux实用程序的 ...