文章目录

  • 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关键字的使用相关推荐

  1. Java线程-线程八锁

    synchronized在方法上加锁 加在非静态方法上.锁住的是this对象 class Test{public synchronized void test(){}} 等价于 class Test{ ...

  2. 线程八锁,同步锁的应用

    锁的八种情况的应用 package com.debuggg.test1.main2; /*** 作者 ZYL* 功能描述 : 题目:判断打印的是"one"or "two& ...

  3. GUC-10 线程八锁

    /** 题目:判断打印的 "one" or "two" ?* * 1. 两个普通同步方法,两个线程,标准打印, 打印? //one two* 2. 新增 Thr ...

  4. 【java线程】锁机制:synchronized、Lock、Condition

    [Java线程]锁机制:synchronized.Lock.Condition 原创 2013年08月14日 17:15:55 标签:Java /多线程 74967 http://www.infoq. ...

  5. 多线程高并发 底层锁机制与优化的最佳实践——各种锁的分类 || synchronized 关键字 倒底锁的是什么东西?|| CAS与ABA问题||锁优化||轻量级锁一定比重量级锁的性能高吗

    多线程高并发 底层锁机制与优化的最佳实践 各种锁的分类 加上synchronized 关键字,共享资源就不会出错 synchronized 关键字 倒底锁的是什么东西? synchronized 锁的 ...

  6. 【并发】线程同步——锁Lock与synchronized比较

    一.简单使用Lock锁 Java 5中引入了新的锁机制--java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lo ...

  7. Java多线程:线程同步(3)- synchronized关键字

  8. java线程同步以及对象锁和类锁解析(多线程synchronized关键字)

    一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...

  9. java中的同步关键字_Java中进程同步问题,锁 和synchronized 关键字的用法

    标签: •对象的锁标志 –每个对象都有一个锁标志 –使用synchronized可与锁标志交互 •synchronized关键字的用法有两种: –synchronized语句 –synchronize ...

最新文章

  1. asp从后台调出的公式怎么参与运算_Excel中使用公式老是出错,这几招帮你轻松解决~...
  2. R语言修改dataframe的列名(column name)实战
  3. LIBCLNTSH.SO: WRONG ELF CLASS: ELFCLASS32错误一例
  4. 技术分享 | 混合云模式下SaaS端前端最佳实践
  5. PCH文件的创建和配置
  6. php5.3降5.2,php5.3降级为5.2
  7. CF1228C. Primes and Multiplication(数学)
  8. postgre sql安装时忘记之前密码时如何处理。
  9. bzoj 1072: [SCOI2007]排列perm(状压dp)
  10. 三星手机真假测试软件,#三星EVO Plus MicroSD存储卡# 火眼金睛识真伪、评测软件测性能...
  11. 重磅!2020国家科学技术奖全名单公布!
  12. 防范蠕虫式勒索软件病毒***的安全预警通告
  13. #S/4HANA 1610: Use case series intro and collection
  14. 蒙特卡洛(Monte Carlo)方法的理解
  15. 流媒体学习之路(mediasoup)——Worker(c++)libuv(番外)
  16. Python JsonPath 详细使用
  17. 最新版苹果公司开发者账户申请
  18. 我的世界服务器信息变英文,我的世界服务器
  19. python共享文件协同编辑_那些可多人协作编辑的在线文档工具
  20. 用“XML解析开发包Jaxp”对XML文件进行Dom方式的CRUD操作

热门文章

  1. 苹果微信换行怎么打_苹果手机微信怎么加密,教你几招快速加密
  2. Java中抽象类的概述及其详解(什么是抽象类?为什么要使用抽象类?抽象类的特点?)
  3. matplotlib生成没有留白的图片
  4. 解决Unknown column XXX in ‘field list‘问题
  5. 小米5 MIUI 10系统完全Root教程 (Root思想通用所有机型)
  6. 数据库范式1NF 2NF 3NF BCNF通俗讲解
  7. 2022-2027年中国共享自行车行业发展监测及投资战略研究报告
  8. 天猫精灵智能设备对接(3)
  9. PAKDD 2019 中国企业深兰科技夺冠:AutoML 如何推动 AI 应用落地?
  10. 2022 -7-18 第八小组 顾宇佳 学习笔记