通过线程八锁问题融会贯通synchronized关键字的使用
文章目录
- 1. 一锁
- 2. 二锁
- 3. 三锁
- 4. 四锁
- 5. 五锁
- 6. 六锁
- 7. 七锁
- 8. 八锁
线程八锁
凯有八门遁甲之术,你晓得线程八锁问题吗?赶紧来看一下吧~
1. 一锁
class Number{public synchronized void a() {log.debug("1");}public synchronized void b() {log.debug("2");}
}
public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }, "t1").start();new Thread(()->{ n1.b(); }, "t2").start();
}
执行主方法,控制台的输出可能是2 1
或是1 2
。因为创建的两个线程在主方法中创建并启动,它们之间谁先能拿到CPU的使用权就谁先执行:
- 如果t1先分到时间片,那么输出为
1 2
- 如果t2先分到时间片,那么输出为
2 1
2. 二锁
class Number{public synchronized void a() {sleep(1); // 需先睡眠1slog.debug("1");}public synchronized void b() {log.debug("2");}
}
public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }, "t1").start();new Thread(()->{ n1.b(); }, "t2").start();
}
情况和上面类似,可能的结果有:
- 如果t1先分到时间片,那么输出情况为:等待1s输出
1 2
- 如果t2先分到时间片,那么输出情况为:先输出2,等待1s后输出1
3. 三锁
class Number{// a、b执行需要先获取锁public synchronized void a() {sleep(1);log.debug("1");}public synchronized void b() {log.debug("2");}// c执行不需要获取锁public void c() {log.debug("3");}
}
public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }, "t1").start();new Thread(()->{ n1.b(); }, "t2").start();new Thread(()->{ n1.c(); }, "t3").start();
}
此时主方法中存在三个线程,c无需获取锁,它会和t1、t2中先获得锁的那个线程同时输出,输出的前后顺序不固定,后续的分析就和上面的一样了。
4. 四锁
class Number{public synchronized void a() {sleep(1);log.debug("1");}public synchronized void b() {log.debug("2");}
}
public static void main(String[] args) {Number n1 = new Number();Number n2 = new Number();new Thread(()->{ n1.a(); }, "t1").start();new Thread(()->{ n2.b(); }, "t2").start();
}
此时t1和t2两个线程之间不存在锁竞争问题,所以它们可以同时获得各自的锁,但是由于t1需要先睡眠1s,所以先输出为2,等待1s后输出1。
5. 五锁
class Number{// 锁对象为Number.Classpublic static synchronized void a() {sleep(1);log.debug("1");}// 锁对象为this对象public synchronized void b() {log.debug("2");}
}
public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }, "t1").start();new Thread(()->{ n2.b(); }, "t2").start();
}
t1和t2两个线程之间仍然不存在线程竞争问题,所以依然先输出为2,等待1s后输出1。
6. 六锁
class Number{// 锁对象为Number.Classpublic static synchronized void a() {sleep(1);log.debug("1");}// 锁对象为Number.Classpublic static synchronized void b() {log.debug("2");}
}
public static void main(String[] args) {Number n1 = new Number();new Thread(()->{ n1.a(); }, "t1").start();new Thread(()->{ n2.b(); }, "t2").start();
}
t1和t2线程竞争的都是Number.Class这个对象锁,所以输出情况了一锁相同:
- 先输出2,等待1s后输出1
- 等待1s后输出1,然后输出2
7. 七锁
class Number{// 锁对象为Number.Classpublic static synchronized void a() {sleep(1);log.debug("1");}// 锁对象为this对象public synchronized void b() {log.debug("2");}
}
public static void main(String[] args) {Number n1 = new Number();Number n2 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n2.b(); }).start();
}
此时t1和t2两个线程之间不存在锁竞争问题,所以它们可以同时获得各自的锁,但是由于t1需要先睡眠1s,所以先输出为2,等待1s后输出1。
8. 八锁
class Number{// 锁对象为Number.Classpublic static synchronized void a() {sleep(1);log.debug("1");}// 锁对象为Number.Classpublic static synchronized void b() {log.debug("2");}
}
public static void main(String[] args) {Number n1 = new Number();Number n2 = new Number();new Thread(()->{ n1.a(); }).start();new Thread(()->{ n2.b(); }).start();
}
此时,t1和t2线程通过不同的Number对象启动,但是它们竞争的仍然都是Number.Class这个类对象锁,所以输出情况了一锁、六锁相同:
- 先输出2,等待1s后输出1
- 等待1s后输出1,然后输出2
看完了线程八锁问题,你应该对于synchronized 对象的锁问题有了清晰的理解与使用了~
通过线程八锁问题融会贯通synchronized关键字的使用相关推荐
- Java线程-线程八锁
synchronized在方法上加锁 加在非静态方法上.锁住的是this对象 class Test{public synchronized void test(){}} 等价于 class Test{ ...
- 线程八锁,同步锁的应用
锁的八种情况的应用 package com.debuggg.test1.main2; /*** 作者 ZYL* 功能描述 : 题目:判断打印的是"one"or "two& ...
- GUC-10 线程八锁
/** 题目:判断打印的 "one" or "two" ?* * 1. 两个普通同步方法,两个线程,标准打印, 打印? //one two* 2. 新增 Thr ...
- 【java线程】锁机制:synchronized、Lock、Condition
[Java线程]锁机制:synchronized.Lock.Condition 原创 2013年08月14日 17:15:55 标签:Java /多线程 74967 http://www.infoq. ...
- 多线程高并发 底层锁机制与优化的最佳实践——各种锁的分类 || synchronized 关键字 倒底锁的是什么东西?|| CAS与ABA问题||锁优化||轻量级锁一定比重量级锁的性能高吗
多线程高并发 底层锁机制与优化的最佳实践 各种锁的分类 加上synchronized 关键字,共享资源就不会出错 synchronized 关键字 倒底锁的是什么东西? synchronized 锁的 ...
- 【并发】线程同步——锁Lock与synchronized比较
一.简单使用Lock锁 Java 5中引入了新的锁机制--java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lo ...
- Java多线程:线程同步(3)- synchronized关键字
- java线程同步以及对象锁和类锁解析(多线程synchronized关键字)
一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...
- java中的同步关键字_Java中进程同步问题,锁 和synchronized 关键字的用法
标签: •对象的锁标志 –每个对象都有一个锁标志 –使用synchronized可与锁标志交互 •synchronized关键字的用法有两种: –synchronized语句 –synchronize ...
最新文章
- asp从后台调出的公式怎么参与运算_Excel中使用公式老是出错,这几招帮你轻松解决~...
- R语言修改dataframe的列名(column name)实战
- LIBCLNTSH.SO: WRONG ELF CLASS: ELFCLASS32错误一例
- 技术分享 | 混合云模式下SaaS端前端最佳实践
- PCH文件的创建和配置
- php5.3降5.2,php5.3降级为5.2
- CF1228C. Primes and Multiplication(数学)
- postgre sql安装时忘记之前密码时如何处理。
- bzoj 1072: [SCOI2007]排列perm(状压dp)
- 三星手机真假测试软件,#三星EVO Plus MicroSD存储卡# 火眼金睛识真伪、评测软件测性能...
- 重磅!2020国家科学技术奖全名单公布!
- 防范蠕虫式勒索软件病毒***的安全预警通告
- #S/4HANA 1610: Use case series intro and collection
- 蒙特卡洛(Monte Carlo)方法的理解
- 流媒体学习之路(mediasoup)——Worker(c++)libuv(番外)
- Python JsonPath 详细使用
- 最新版苹果公司开发者账户申请
- 我的世界服务器信息变英文,我的世界服务器
- python共享文件协同编辑_那些可多人协作编辑的在线文档工具
- 用“XML解析开发包Jaxp”对XML文件进行Dom方式的CRUD操作
热门文章
- 苹果微信换行怎么打_苹果手机微信怎么加密,教你几招快速加密
- Java中抽象类的概述及其详解(什么是抽象类?为什么要使用抽象类?抽象类的特点?)
- matplotlib生成没有留白的图片
- 解决Unknown column XXX in ‘field list‘问题
- 小米5 MIUI 10系统完全Root教程 (Root思想通用所有机型)
- 数据库范式1NF 2NF 3NF BCNF通俗讲解
- 2022-2027年中国共享自行车行业发展监测及投资战略研究报告
- 天猫精灵智能设备对接(3)
- PAKDD 2019 中国企业深兰科技夺冠:AutoML 如何推动 AI 应用落地?
- 2022 -7-18 第八小组 顾宇佳 学习笔记