JUC学习之8锁现象
时间:2022-07-22
本文章向大家介绍JUC学习之8锁现象,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
8锁现象,其实就是关于锁的八个问题,本节我们通过八个问题,逐渐带大家加深对锁的认识,为了方便演示,这里全部用
synchronized
演示。
synchronized 示例代码:
People1 people = new People1();
People1 people2 = new People1();
new Thread(people::eat,"A").start();
TimeUnit.SECONDS.sleep(2);
new Thread(people2::play,"B").start();
new Thread(people2::study,"C").start();
public class People1 {
public synchronized void eat() {
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("synchronized method -> 吃饭");
}
public synchronized void play() {
System.out.println("synchronized method -> 玩耍");
}
public void study() {
System.out.println("synchronized method -> 学习");
}
}
问题1:同一对象调用两个同步方法,先执行哪个?
synchronized method -> 吃饭
synchronized method -> 玩耍
问题2:eat延迟4秒呢?
synchronized method -> 吃饭
synchronized method -> 玩耍
问题3:同一对象调用1个同步方法,1个普通方法,先执行哪个?不同对象呢?
General method -> 学习
synchronized method -> 吃饭
General method -> 学习
synchronized method -> 吃饭
问题4:不同对象调用两个同步方法,先执行哪个?
synchronized method -> 玩耍
synchronized method -> 吃饭
总结:synchronized
锁的是方法的调用者
,这里就是people1,不同的对象对应不同的锁
static synchronized 示例代码:
People2 people = new People2();
People2 people2 = new People2();
new Thread(() -> people.eat(),"A").start();
TimeUnit.SECONDS.sleep(2);
new Thread(() -> people2.play(),"B").start();
new Thread(() -> people2.study(),"C").start();
public class People2 {
public static synchronized void eat() {
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("static synchronized method-> 吃饭");
}
public static synchronized void play() {
System.out.println("static synchronized method-> 玩耍");
}
public synchronized void study() {
System.out.println("synchronized method-> 学习");
}
}
问题5:同一对象调用两个静态同步方法,先执行哪个?
static synchronized method-> 吃饭
static synchronized method-> 玩耍
问题6:不同对象调用两个静态同步方法,先执行哪个?
static synchronized method-> 吃饭
static synchronized method-> 玩耍
问题7:同一对象调用1个静态同步方法,1个同步方法,先执行哪个?
synchronized method-> 学习
static synchronized method-> 吃饭
问题8:不同对象调用1个静态同步方法,1个同步方法,先执行哪个?
synchronized method-> 学习
static synchronized method-> 吃饭
总结:static
修饰的方法属于Class模版
,只有一个
相信大家现在应该都明白了吧!
Q.E.D.
- 使用 React 和 GraphQL 做一个todo list
- 徒手撸框架---实现 Aop
- 基于 Token 的 WEB 后台认证机制
- TiDB 源码阅读系列文章(二)初识 TiDB 源码
- Java 异常处理的 9 个最佳实践
- JavaScript 深拷贝性能分析
- Git 的使用
- Linux 基础:文件查找 find
- PHP 闭包(Closure)初探
- linux服务器apache服务配置wordpress伪静态
- 用 Python 实现一个大数据搜索引擎
- 关于 Java 你不知道的 10 件事
- 如何在一周之内获得GitHub stars 3500+ —为什么对于程序员这是如此的重要
- 程序员做完整性检查的命令行工具
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- android中Context深入详解
- Android中Notification通知用法详解
- Android build文件的删除的方法
- Android自定义Notification添加点击事件
- 深入理解Android Bitmap
- Android基于AlarmManager实现用户在线心跳功能示例
- 详解Android中获取软键盘状态和软键盘高度
- Android流式布局FlowLayout详解
- Linux 专题
- Go语言实现UDP通信
- Android多渠道打包的方法步骤
- Android编程实现压缩图片并加载显示的方法
- Android串口通信封装之OkUSB的示例代码
- Android 中Activity 之间传递参数
- Android开发简单实现摇动动画的方法