Java并发(十六)----线程八锁
2023/12/2 14:32:55
本文主要是介绍Java并发(十六)----线程八锁,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
所谓的“线程八锁”
其实就是看 synchronized 锁住的是哪个对象
情况1:12 或 21都是有可能的,就看cpu先调度哪个线程
@Slf4j(topic = "c.Number") 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(); }).start(); new Thread(()->{ n1.b(); }).start(); }
情况2:1s后12,或 2 1s后 1 ,还是看cpu先调度哪个线程
@Slf4j(topic = "c.Number") class Number{ public synchronized void a() { sleep(1); //睡眠1秒 log.debug("1"); } public synchronized void b() { log.debug("2"); } } public static void main(String[] args) { Number n1 = new Number(); new Thread(()->{ n1.a(); }).start(); new Thread(()->{ n1.b(); }).start(); }
情况3:3 1s后 12 、 23 1s后 1 、 32 1s后 1,3肯定是最开始的打印的,就看1或2谁先打印
@Slf4j(topic = "c.Number") class Number{ public synchronized void a() { sleep(1);//睡眠1秒 log.debug("1"); } public synchronized void b() { log.debug("2"); } public void c() { // 未加锁 log.debug("3"); } } public static void main(String[] args) { Number n1 = new Number(); new Thread(()->{ n1.a(); }).start(); new Thread(()->{ n1.b(); }).start(); new Thread(()->{ n1.c(); }).start(); }
情况4:2 1s 后 1,没有互斥,同时运行,2先打印,sleep 1秒后打印1
@Slf4j(topic = "c.Number") class Number{ public synchronized void a() { sleep(1);//睡眠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(); }).start(); new Thread(()->{ n2.b(); }).start(); }
情况5:2 1s 后 1,锁住的对象不同,所以和题4一样,不存在互斥。
@Slf4j(topic = "c.Number") class Number{ public static synchronized void a() { sleep(1);//睡眠1秒 log.debug("1"); } public synchronized void b() { log.debug("2"); } } public static void main(String[] args) { Number n1 = new Number(); new Thread(()->{ n1.a(); }).start(); new Thread(()->{ n1.b(); }).start(); }
情况6:1s 后12, 或 2 1s后 1,还是看cpu先调度哪个线程
@Slf4j(topic = "c.Number") class Number{ public static synchronized void a() { sleep(1);//睡眠1秒 log.debug("1"); } public static synchronized void b() { log.debug("2"); } } public static void main(String[] args) { Number n1 = new Number(); new Thread(()->{ n1.a(); }).start(); new Thread(()->{ n1.b(); }).start(); }
情况7:2 1s 后 1,锁住的对象不同,所以和题4一样,不存在互斥。
@Slf4j(topic = "c.Number") class Number{ public static synchronized void a() { sleep(1);//睡眠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(); }).start(); new Thread(()->{ n2.b(); }).start(); }
情况8:1s 后12, 或 2 1s后 1,锁着的同一个对象,还是看cpu先调度哪个线程
@Slf4j(topic = "c.Number") class Number{ public static synchronized void a() { sleep(1);//睡眠1秒 log.debug("1"); } public 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(); }
这篇关于Java并发(十六)----线程八锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-082024年常用的情绪识别API
- 2025-01-07如何利用看板工具优化品牌内容创作与审批,确保按时发布?
- 2025-01-07百万架构师第十一课:源码分析:Spring 源码分析:Spring源码分析前篇|JavaGuide
- 2025-01-07质量检测标准严苛,这 6 款办公软件达标了吗?
- 2025-01-07提升品牌活动管理的效率:看板工具助力品牌活动日历的可视化管理
- 2025-01-07宠物商场的精准营销秘籍:揭秘看板软件的力量
- 2025-01-07“30了,资深骑手” | 程序员能有什么好出路?
- 2025-01-07宠物公园的营销秘籍:看板软件如何帮你精准触达目标客户?
- 2025-01-07从任务分解到资源优化:甘特图工具全解析
- 2025-01-07企业升级必备指南:从传统办公软件到SaaS工具的转型攻略