JUC 并发编程--03, 深刻理解锁, 8 锁现象,
如何判断锁的是谁? 永远知道是什么锁,
线程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 锁现象,的更多相关文章
- JUC 并发编程--12, 使用AtomicInteger 实现一把锁(排队自旋锁), 代码演示
前面 使用自旋锁实现了一把锁,(请看 第5篇) volatile 三大特性: 可见性, 不保证原子性, 禁止指令重排 为了解决 volatile不保证原子性的问题, 引入了原子类, AtomicInt ...
- JUC并发编程学习笔记
JUC并发编程学习笔记 狂神JUC并发编程 总的来说还可以,学到一些新知识,但很多是学过的了,深入的部分不多. 线程与进程 进程:一个程序,程序的集合,比如一个音乐播发器,QQ程序等.一个进程往往包含 ...
- JUC并发编程基石AQS之主流程源码解析
前言 由于AQS的源码太过凝练,而且有很多分支比如取消排队.等待条件等,如果把所有的分支在一篇文章的写完可能会看懵,所以这篇文章主要是从正常流程先走一遍,重点不在取消排队等分支,之后会专门写一篇取消排 ...
- Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信
Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...
- JUC并发编程基石AQS源码之结构篇
前言 AQS(AbstractQueuedSynchronizer)算是JUC包中最重要的一个类了,如果你想了解JUC提供的并发编程工具类的代码逻辑,这个类绝对是你绕不过的.我相信如果你是第一次看AQ ...
- JUC : 并发编程工具类的使用
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.JUC是什么 1.JUC定义 JUC,即java.util.concurrent 在并发编程中使用的 ...
- JUC并发编程与高性能内存队列disruptor实战-上
JUC并发实战 Synchonized与Lock 区别 Synchronized是Java的关键字,由JVM层面实现的,Lock是一个接口,有实现类,由JDK实现. Synchronized无法获取锁 ...
- JUC并发编程与高性能内存队列disruptor实战-下
并发理论 JMM 概述 Java Memory Model缩写为JMM,直译为Java内存模型,定义了一套在多线程读写共享数据时(成员变量.数组)时,对数据的可见性.有序性和原子性的规则和保障:JMM ...
- java并发编程的艺术(一)---锁的基本属性
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...
随机推荐
- hdu4920 矩阵乘法%3
题意: 给你两个矩阵,让你求两矩阵的乘积,然后3取余.矩阵是n*n的,n<=800 思路: 如果什么都不考虑的话,矩阵的乘法是o(n^3)的,800*800*800 = ...
- UVA11520填充正方形
题意: 给你一个n*n的矩阵,让你往里面添加大写字母,矩阵有的字母已经给填好了,然后要求是每个格子都不能与他相邻的格子的大写字母相同,如果有多个答案,输出从上到下,从左到右所连接的成的那个n ...
- 仁者见仁:缓冲区栈溢出之利用 Exploit 形成完整攻击链完全攻略(含有 PayLoad)
> 前言 内存缓冲区溢出又名 Buffer OverFlow,是一种非常危险的漏洞,在各种操作系统和应用软件中广泛存在.利用缓冲区溢出进行的攻击,小则导致程序运行失败.系统宕机等后果,大则可以取 ...
- Windows PE变形练手2-开发一套自己的PE嵌入模板
PE嵌入模板 编写一段代码,生成一个已经处理过重定位信息,同时所有的内容都在代码段里,并且没有导入表的PE程序,把这个程序嵌入到其他PE的相关位置,能够独立的运行,接下来是整理了2个模板,一个是Hel ...
- scrapy爬虫案例--爬取阳关热线问政平台
阳光热线问政平台:http://wz.sun0769.com/political/index/politicsNewest?id=1&page=1 爬取最新问政帖子的编号.投诉标题.投诉内容以 ...
- Java中如何保证线程顺序执行
只要了解过多线程,我们就知道线程开始的顺序跟执行的顺序是不一样的.如果只是创建三个线程然后执行,最后的执行顺序是不可预期的.这是因为在创建完线程之后,线程执行的开始时间取决于CPU何时分配时间片,线程 ...
- C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架
C#基于Mongo的官方驱动手撸一个简易版MongoDB-ORM框架 如题,在GitHub上找了一圈想找一个MongoDB的的ORM框架,未偿所愿,就去翻了翻官网(https://docs.mongo ...
- Spring MVC工作原理及源码解析(三) HandlerMapping和HandlerAdapter实现原理及源码解析
1.HandlerMapping实现原理及源码解析 在前面讲解Spring MVC工作流程的时候我们说过,前端控制器收到请求后会调⽤处理器映射器(HandlerMapping),处理器映射器根据请求U ...
- Linux使用gcc编译时设置编码格式
我们编写 C 程序时,可以使用 ANSI 编码,或是 UTF-8 编码:在编译程序时,可以使用以下的选项告诉编译器: -finput-charset=GB2312 -finput-charset=UT ...
- TCP 中的两个细节点
TCP 超时和重传 没有永远不出错误的通信,这句话表明着不管外部条件多么完备,永远都会有出错的可能.所以,在 TCP 的正常通信过程中,也会出现错误,这种错误可能是由于数据包丢失引起的,也可能是由于数 ...