感谢秦疆老师的JUC并发编程视频,更多了解哔哩哔哩搜索【狂神说Java】。

本文内容源于秦疆老师的JUC并发编程视频教程。给狂神推荐,点赞吧!

关于锁的八个问题 深刻理解我们的锁

如何判断锁的是谁!永远的知道什么锁,锁到底锁的是谁!

1.标准情况下,两个线程先打印 发短信 还是打电话

package demo3;import java.util.concurrent.TimeUnit;/*** 1.标准情况下,两个线程先打印 发短信 还是打电话*/
public class TestLock1 {public static void main(String[] args) {Phone phone = new Phone();new Thread(()->{phone.sendSms();},"A").start();//捕获try {TimeUnit.SECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();}new Thread(()->{phone.call();},"B").start();}
}class Phone{public synchronized void sendSms(){System.out.println("发短信!");}public synchronized void call(){System.out.println("打电话!");}}//输出:
发短信!
打电话!

2.sendSms()延迟4s情况下,两个线程先打印 发短信 还是打电话 ?

package demo3;import java.util.concurrent.TimeUnit;/*** 2.sendSms()延迟4s情况下,两个线程先打印 发短信 还是打电话 ?*/
public class TestLock1 {public static void main(String[] args) {Phone phone = new Phone();new Thread(() -> {phone.sendSms();}, "A").start();//捕获try {TimeUnit.SECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();}new Thread(() -> {phone.call();}, "B").start();}
}class Phone {public synchronized void sendSms() {try {TimeUnit.SECONDS.sleep(4);} catch (Exception e) {e.printStackTrace();}System.out.println("发短信!");}public synchronized void call() {System.out.println("打电话!");}}//输出:
发短信!
打电话!

分析:

Phone phone = new Phone();
new Thread(() -> {phone.sendSms(); }, "A").start();
new Thread(() -> {phone.call(); }, "B").start();synchronized 锁的存在 锁的对象是方法的调用者!
两个方法用的是同一把锁,谁先拿到就谁先执行!

3.增加一个普通方法hello() ,线程先打印哪个?

package demo3;import java.util.concurrent.TimeUnit;/***3.增加一个普通方法hello() ,线程先打印哪个?*/
public class TestLock2 {public static void main(String[] args) {Phone2 phone = new Phone2();new Thread(() -> {phone.sendSms();}, "A").start();//捕获try {TimeUnit.SECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();}new Thread(() -> {phone.call();}, "B").start();new Thread(() -> {phone.hello();}, "c").start();}
}class Phone2 {public synchronized void sendSms() {try {TimeUnit.SECONDS.sleep(4);} catch (Exception e) {e.printStackTrace();}System.out.println("发短信!");}public synchronized void call() {System.out.println("打电话!");}//普通方法 这里没有锁 不是同步方法,不受锁的影响public  void hello() {System.out.println("hello,你好!");}}//输出:
hello,你好!
发短信!
打电话!

4.两个对象,两个同步方法,线程先打印哪个?

package demo3;import java.util.concurrent.TimeUnit;/***4.两个对象,两个同步方法,线程先打印哪个?*/
public class TestLock2 {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 (Exception e) {e.printStackTrace();}new Thread(() -> {phone2.call();}, "B").start();}
}class Phone2 {public synchronized void sendSms() {try {TimeUnit.SECONDS.sleep(4);} catch (Exception e) {e.printStackTrace();}System.out.println("发短信!");}public synchronized void call() {System.out.println("打电话!");}//普通方法 这里没有锁 不是同步方法,不受锁的影响public  void hello() {System.out.println("hello,你好!");}}//输出:
打电话!
发短信!

5.增加两个静态的同步方法,线程先打印哪个?

package demo3;import java.util.concurrent.TimeUnit;/*** 5.增加两个静态的同步方法,线程先打印哪个?*/
public class TestLock3 {public static void main(String[] args) {Phone3 phone = new Phone3();new Thread(() -> {phone.sendSms();}, "A").start();//捕获try {TimeUnit.SECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();}new Thread(() -> {phone.call();}, "B").start();}
}//Phone3 唯一的一个class 对象  全局唯一
// Class<Phone3> phone3Class = Phone3.class;
class Phone3 {//static 静态方法 类一加载就有了! Class模板//锁的是Classpublic  static synchronized void sendSms() {try {TimeUnit.SECONDS.sleep(4);} catch (Exception e) {e.printStackTrace();}System.out.println("发短信!");}public  static synchronized void call() {System.out.println("打电话!");}}//输出:
发短信!
打电话!

6.两个对象,增加两个静态的同步方法,线程先打印哪个?

package demo3;import java.util.concurrent.TimeUnit;/*** 6.两个对象,增加两个静态的同步方法,线程先打印哪个?*/
public class TestLock3 {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 (Exception e) {e.printStackTrace();}new Thread(() -> {phone2.call();}, "B").start();}
}//Phone3 唯一的一个class 对象  全局唯一
// Class<Phone3> phone3Class = Phone3.class;
class Phone3 {//static 静态方法 类一加载就有了! Class模板//锁的是Classpublic  static synchronized void sendSms() {try {TimeUnit.SECONDS.sleep(4);} catch (Exception e) {e.printStackTrace();}System.out.println("发短信!");}public  static synchronized void call() {System.out.println("打电话!");}}//输出:
发短信!
打电话!

7.一个静态的同步方法,一个普通的同步方法,一个对象,线程先打印哪个?

package demo3;import java.util.concurrent.TimeUnit;/*** 7.一个静态的同步方法,一个普通的同步方法,线程先打印哪个?*/
public class TestLock4 {public static void main(String[] args) {//Phone4 phone = new Phone4();new Thread(() -> {phone.sendSms();}, "A").start();//捕获try {TimeUnit.SECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();}new Thread(() -> {phone.call();}, "B").start();}
}class Phone4 {//static 静态的同步方法 锁的是 Class模板 类一加载就有了!public  static synchronized void sendSms() {try {TimeUnit.SECONDS.sleep(4);} catch (Exception e) {e.printStackTrace();}System.out.println("发短信!");}//普通同步方法 锁的是资源public  synchronized void call() {System.out.println("打电话!");}}//输出:
打电话!
发短信!

8.一个静态的同步方法,一个普通的同步方法,两个对象,线程先打印哪个?

package demo3;import java.util.concurrent.TimeUnit;/*** 8.一个静态的同步方法,一个普通的同步方法,两个对象,线程先打印哪个?*/
public class TestLock4 {public static void main(String[] args) {//两个对象Phone4 phone1 = new Phone4();Phone4 phone2 = new Phone4();new Thread(() -> {phone1.sendSms();}, "A").start();//捕获try {TimeUnit.SECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();}new Thread(() -> {phone2.call();}, "B").start();}
}class Phone4 {//static 静态的同步方法 锁的是 Class模板 类一加载就有了!public  static synchronized void sendSms() {try {TimeUnit.SECONDS.sleep(4);} catch (Exception e) {e.printStackTrace();}System.out.println("发短信!");}//普通同步方法 锁的是资源public  synchronized void call() {System.out.println("打电话!");}}//输出:
打电话!
发短信!

小结

  • new this 具体的一个手机
  • static Class 唯一的一个模板

4.如何判断锁的是谁 :八个锁的问题相关推荐

  1. sqlserver锁机制详解(sqlserver查看锁)

    简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于 大多数数据库来说是需要同时处理多个查询 ...

  2. 最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁

    在Java并发场景中,会涉及到各种各样的锁,比如:高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景,这些锁有对应的种类:公平锁,乐观锁,悲观锁等等,这篇文章来详细介绍各种锁的分类: 公 ...

  3. 【Java锁体系】一、悲观锁和乐观锁

    目录: [Java锁体系]一.悲观锁和乐观锁 [Java锁体系]二.Java中的CAS机制算法 [Java锁体系]三.自旋锁详解 [Java锁体系]四.Synchronized关键字详解 [Java锁 ...

  4. JUC - 多线程之悲观锁、乐观锁,读写锁(共享锁、独享锁),公平非公平锁,可重入锁,自旋锁,死锁(十)

    Java中主要有如下锁 一.悲观锁.乐观锁 悲观锁:当前线程去操作数据的时候,总是认为别的线程会去修改数据,所以每次操作数据的时候都会上锁,别的线程去操作数据的时候就会阻塞,比如synchronize ...

  5. mysql锁总结知乎_Mysql悲观锁乐观锁区别与使用场景

    概念上区别 乐观锁(Optimistic Locking):顾名思义,对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,"乐观"的认为加锁一定会成功的,在最后一步 ...

  6. 删除sybase里面的锁_一起来学习分布式锁

    为什么要用分布式锁 我们先来看一个业务场景: 系统 A 是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存 足够了才会给用户下单. 由于 ...

  7. Redis实现分布式锁全局锁—Redis客户端Redisson中分布式锁RLock实现

    2019独角兽企业重金招聘Python工程师标准>>> 1. 前因 以前实现过一个Redis实现的全局锁, 虽然能用, 但是感觉很不完善, 不可重入, 参数太多等等. 最近看到了一个 ...

  8. Java锁详解:“独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁+线程锁”

    在Java并发场景中,会涉及到各种各样的锁如公平锁,乐观锁,悲观锁等等,这篇文章介绍各种锁的分类: 公平锁/非公平锁 可重入锁 独享锁/共享锁 乐观锁/悲观锁 分段锁 自旋锁 线程锁 乐观锁 VS 悲 ...

  9. 【JUC并发编程06】多线程锁 (公平锁和非公平锁,死锁,可重锁)

    文章目录 6 多线程锁 (公平锁和非公平锁,死锁,可重锁) 6.1 synchronized 锁的八种情况 6.2 对上述例子的总结 6.3 公平锁和非公平锁 6.4 可重入锁 6.5 死锁 6 多线 ...

  10. 分布式锁(一) Zookeeper分布式锁

    什么是Zookeeper? Zookeeper(业界简称zk)是一种提供配置管理.分布式协同以及命名的中心化服务,这些提供的功能都是分布式系统中非常底层且必不可少的基本功能,但是如果自己实现这些功能而 ...

最新文章

  1. 怎么在PHP植入音乐,PHP网站插入音乐
  2. linux中chmod与chown两个命令详解
  3. php留言板项目经验,php工程师简历项目经验填写样本
  4. C# ProgressBar用法:模拟进度条
  5. wamp+多版本mysql_WampServer下安装多个版本的PHP、mysql、apache图文教程,_PHP教程
  6. Java 8 新的时间日期库java.time
  7. 已处理证书链,但是在不受信任提供程序信任的根证书中终止 - Windows 7安装.Net Framework 4.7.2时出现此问题
  8. 修改vscode代码字体大小
  9. 《应用商务统计分析》前言
  10. cisco交换机-路由器配置命令
  11. 怎么理解JS Promise
  12. 处理行内元素行内块元素中间空隙
  13. 我的世界java1.13下_Minecraft我的世界Java版1.13-pre3更新内容
  14. 如何区分VR、AR和MR
  15. ROS保姆级教程(二)--Service通讯方式实现
  16. .chm文件是啥,以及打开方法(我电脑win7)
  17. 网络基础之基于距离矢量的动态路由(RIP)
  18. mac地址储存在计算机的内存,mac地址通常存在计算机的
  19. 【历史上的今天】6 月 15 日:第一个手机病毒;AI 巨匠司马贺诞生;Chromebook 发布
  20. 何去何从?——从性能测试到全栈测试的思考

热门文章

  1. 《赌玉》--------人生就是一场赌博,眼看准,下手狠
  2. CAD文件转换为SVG文件的探讨
  3. InteliJ IDEA 编写jsp没有提示问题( 两个解决方法)
  4. 基于SSM实现的网上订餐系统|点餐餐厅系统
  5. CPP----高质量编程100例
  6. 《Kinect应用开发实战:用最自然的方式与机器对话》一第1章 自然人机交互技术漫谈1.1 自然人机交互技术的发展...
  7. tRNA-m5C转运RNA(tRNA)修饰5-甲基胞嘧啶(m5C)|tRNA修饰m1Am2A (2-methyladenosine)
  8. 学成在线项目数据库表结构分析
  9. funcode环境配置(亲测有效)
  10. 最好的MATLAB入门教程(没有之一!)