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.
- 另类大数据:中国有嘻哈的rapper们都在唱些什么?
- jquery属性值选择器
- sqlserver 2000/2005 Ambiguous column error错误解决办法
- jquery 层级选择器
- Twitter发布基于组件的轻量级JavaScript框架——Flight
- jquery的基本选择器
- WordPress 路径相关函数总结(一):站点路径相关函数
- 修复Visual Studio 2010 SP1的Toolbox导致的VS不可用
- 破解Excel 密码保护
- 配置Subversion
- WordPress 路径相关函数总结(二):主题路径相关函数
- ASP.NET 2.0 中 Web 事件
- Visual Studio 必备可视化插件推荐
- WordPress 路径相关函数总结(一):站点路径相关函数
- 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 数组属性和方法
- Python部署rad+xray自动化
- 2.建立第一个django项目与配置
- Flutter基础widgets教程-Radio篇
- Django中的QuerySet
- Python—requests模块详解
- python爬虫伪装请求头---fake-useragent
- Flutter基础widgets教程-RaisedButton篇
- 记一次 excel vba 参考手册爬虫实战,不必要的一次爬虫。
- xray子域名扫描结果导出
- AWS的湖仓一体使用哪种数据湖格式进行衔接?
- python 行政区域地址标准化:业务经理填报的地址乱起八糟,高德接口有点厉害!
- python 行政区域地址标准化:业务经理填报的地址乱起八糟,高德接口有点厉害! -- 后续,使用分词思路完成解析
- pandas 一维台账数据与二维表格数据的转换
- Flutter基础widgets教程-Row篇
- padans 关于数据处理的杂谈 -- 时序数