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

线程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. Android so加固的简单脱壳

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78077603 Android应用的so库文件的加固一直存在,也比较常见,特地花时间 ...

  2. hdu3117 斐波那契前后4位

    题意:       求斐波那契的前后4位,n <= 10^8. 思路:       至于前四位,和hdu1568的求法一样:       http://blog.csdn.net/u013761 ...

  3. Python中对序列数据的汇总(collections模块)

    目录 Counter most_common 对于序列如字符串str.列表list和tuple可以统计里面数据出现的次数.我们使用的是 collections 模块. collections模块的常用 ...

  4. 利用 Windows 线程池定制的 4 种方式完成任务(Windows 核心编程)

    Windows 线程池 说起底层的线程操作一般都不会陌生,Windows 提供了 CreateThread 函数来创建线程,为了同步线程的操作,Windows 提供了事件内核对象.互斥量内核对象.关键 ...

  5. Android系统自带的android.util.Base64的实现源码

    由于Android逆向还原的时候,经常需要用到android.util.Base64的代码,因此从Android 4.4.4的 系统里抠出来进行备份,懒得用其他的代码进行修改替换了. /* * Cop ...

  6. NTDDK 从两个最简单的驱动谈起

    第 1 章 从两个最简单的驱动谈起 Windows 驱动程序的编写,往往需要开发人员对 Windows 内核有深入了解和大量的内 核调试技巧,稍有不慎,就会造成系统的崩溃.因此,初次涉及 Window ...

  7. ArrayList初步使用

    ️Practice the usage of ArrayList all of String with a exampe of NoteBook. ArrayList all of String的部分 ...

  8. C++ primer plus读书笔记——第15章 友元、异常和其他

    第15章 友元.异常和其他 1. 友元类的所有方法都可以访问原有类的私有成员和保护成员.另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元.哪些函数.成员函数.或类为友元是由类定义的, ...

  9. 北航OO(2020)第四单元博客作业暨学期总结

    一.第四单元架构设计 1.第一次作业 我在本次作业中设置了多个储存结构:Directory,ElementsInName,ElementsInId,Cache. Directory: 顾名思义,这是个 ...

  10. head tail diff -c fff hhh 前5行 后5行 区别 动态显示文本最新信息: $tail -f crawler.log

    显示文件第一行: $head -1 filename 显示文件倒数第五行: $tail -5 filename ]# tail -5 test.py option=sys.argv[1] main(o ...