当前位置:数据分析 > 【第186期】一口气讲讲Synchronized同步方法的八种使用场景

【第186期】一口气讲讲Synchronized同步方法的八种使用场景

  • 发布:2023-09-29 09:37

May 17, 2022 3:57 pm • 面试问题 • 阅读 10 点击上方“Java面试题精选”,关注公众号 面试时画图,查漏补缺 >>番外:往期面试题,10个为单位放在这个公众号菜单栏->面试题,有需要的欢迎阅读 阶段总结合集:001至180期总结,方便阅读(新增设计模式) 介绍 本文将介绍7种同步方式的接入场景。我们来看看七种情况下多线程访问同步方法是否仍然是线程安全的。这些场景是多线程编程中经常遇到的,也是面试时经常被问到的问题,所以无论是理论还是实践,这些都是多线程场景中必须掌握的场景。 八种使用场景: 接下来我们通过代码实现来判断以下场景是否是线程安全的以及为什么。 同步方法,两个线程同时访问同一个对象 两个线程同时访问两个对象的同步方法 两个线程同时访问(一个或两个)对象的静态同步方法 两个线程同时访问(一个或两个)对象的同步方法和异步方法。 两个线程访问同一个对象中的同步方法,同步方法调用非同步方法。 两个线程同时访问同一个对象的不同同步方法 两个线程同时访问静态同步和非静态同步方法。 同步方法抛出异常后,JVM会自动释放锁。 场景一:两个线程同时访问同一个对象同步方法 分析:这种情况是经典对象锁中的方法锁。两个线程竞争同一个对象锁,因此相互等待,是线程安全的。 两个线程同时访问同一个对象的同步方法是线程安全的。 我们在上一篇文章中已经讲过,这里:【第185期】面试官:能谈谈Synchronized实现对象锁的两种方式及其原理吗? 场景二:两个线程同时访问两个对象的同步方法 这种场景就是对象锁失败的场景。原因是访问的是两个对象的同步方法,所以两个线程分别持有两个线程的锁,所以不会互相限制。加锁的目的是让多个线程竞争同一个锁。在这种情况下,多个线程不再竞争同一个锁,而是各自持有一个锁。所以我们的结论是: 两个线程同时访问两个对象的synchronized方法是线程不安全的。 代码验证:线程名称:Thread-0,开始运行线程名称:Thread-0,抛出异常,释放锁线程名称:Thread-1,开始运行线程“Thread-0”中的异常 java.lang.RuntimeException at com.study.synchronize 。 conditions.Condition7.method0(www.sychzs.cn:34) 位于 www.sychzs.cn(www.sychzs.cn:17) 位于 www.sychzs.cn(www.sychzs.cn:748) 线程:线程 - 1、运行后测试结束。 结果分析: 可以看到线程仍然是串行执行的,说明是线程安全的。而且,异常发生后,也不会造成死锁。 JVM会自动释放发生异常的线程的锁对象,其他线程将获取锁并继续执行。 总结 本文总结并用代码实现和验证了synchronized的各种使用场景,以及各种场景发生的原因和结论。我们分析的理论基础是synchronized关键字的锁对象是谁?多个线程是否竞争同一个锁?根据这个条件,判断线程是否安全。因此,在分析和演练了这些场景之后,我们在以后使用多线程编程的时候,也可以通过分析锁对象来判断线程是否安全,从而避免此类问题的发生。 本文涵盖了synchronized关键字最重要的使用场景。这也是面试官经常问到的问题。是一篇值得大家仔细阅读、亲自实践的文章。如果您喜欢这篇文章,请点赞并保存。 来源:www.sychzs.cn/x541211190/article/details/106272922 而不是在网上搜索问题?还不赶快关注我们吧~ 版权声明:本文内容由网友自愿贡献,本文所表达的观点仅代表作者自己的观点。本网站仅提供信息存储空间服务,不拥有任何所有权,也不承担相关法律责任。如果您发现本站有任何涉嫌侵权/非法内容,请发送邮件举报。一经核实,该网站将立即删除。 本文由斑马博客整理。本文链接为:https://www.sychzs.cn/index.php/post/7515.html

相关文章

最新资讯

热门推荐