面试题之死锁解密
Posted 猿天地
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题之死锁解密相关的知识,希望对你有一定的参考价值。
死锁的概念
在多线程环境中,我们经常会遇到多个线程访问同一个共享资源的情况,这个时候必须考虑如何维护数据一致性,常见的方式是加锁处理。只有拿到锁的线程才可以访问共享资源,通过锁就可以让线程对共享资源的访问都是顺序的,避免出现一些数据不一致的问题。
在使用锁的过程中同样也有风险,最为常见的就是死锁现象。死锁就相当于绳子打死结一样,解不开了。在程序中出现这样的情况往往是由于多个线程同时锁住多个资源不释放导致的。
编写一个死锁程序
public class Deadlock {
public static String str1 = "str1";
public static String str2 = "str2";
public static void main(String[] args){
Thread a = new Thread(() -> {
try{
while(true){
synchronized(Deadlock.str1){
System.out.println(Thread.currentThread().getName()+"锁住 str1");
Thread.sleep(1000);
synchronized(Deadlock.str2){
System.out.println(Thread.currentThread().getName()+"锁住 str2");
}
}
}
}catch(Exception e){
e.printStackTrace();
}
});
Thread b = new Thread(() -> {
try{
while(true){
synchronized(Deadlock.str2){
System.out.println(Thread.currentThread().getName()+"锁住 str2");
Thread.sleep(1000);
synchronized(Deadlock.str1){
System.out.println(Thread.currentThread().getName()+"锁住 str1");
}
}
}
}catch(Exception e){
e.printStackTrace();
}
});
a.start();
b.start();
}
}
上面的代码就是一个完整的死锁程序,程序中有两个线程,线程1锁住了str1,获得锁之后休眠1秒钟,这个时候线程2锁住了str2,也进行休眠操作。
线程1休眠完了之后去锁str2,但是str2已经被线程2给锁住了,这边只能等待,同样的道理,线程2休眠完之后也要去锁str1,同样也会等待,这样死锁就产生了。
如果我们将下面这2行代码的值改成一样,死锁还会存在吗?
public static String str1 = "str1";
public static String str2 = "str1";
答案是不会,为什么?
网上看到别人的回答:在声明一个对象作为锁的时候要注意字符串类型锁对象,因为字符串有一个常量池,如果不同的线程持有的锁是具有相同字符的字符串锁时,两个锁实际上同一个锁。
如何查看死锁
首先程序不会往下执行了,这是直观的能够看到的死锁现象,看不到的我们可以通过jstack PID查看线程信息,有死锁的话在最下面会告诉我们检测到了死锁的存在,如下图:
关键信息:Found one Java-level deadlock
高并发编程带来的挑战远远不止一个死锁这么简单,还有很多未知的问题,想要深入的掌握非常不容易。
为了感觉大家一致以来的支持,也为了能够让大家学好高并发编程,特意赠送三本书籍来帮助大家学习。
Java高并发编程详解:多线程与架构设计介绍
作者毫无保留地分享了多年的Java服务器、大数据程序开发架构经验和实践。实战性强,从底层原理的角度总结和归纳各个技术细节,结合真实的案例讲解高并发程序设计架构的技巧。
适读人群 :
1. 开发人员
他们可以非常系统地掌握Java多线程高并发的开发技巧和深入理解其中API的细节;
2. 架构师
他们可以掌握架构设计的技巧,搭建高吞吐量高可用的Java应用程序;
3. 关于Java技术的程序员
立足于线程源码剖析,从基础入手,逐层渐进深入,环环紧扣,针对技术细节进行了细致归纳,在解读源码的时候又引入了优秀的架构设计。
以业务场景下的真实问题作为导向,详细阐述每一个解决方案的来龙去脉,突出“身临其境”的阅读效果。
将大量的实际案例、原理剖析和实战代码相结合,让读者能够更加清晰深入地理解每一个技术细节的用法和实用技巧。
结合业界公认的好的设计架构技巧模式解决实际开发中遇到的问题,站在程序架构设计的角度指导读者设计高效灵活的多线程应用程序。
活动规则
本次活动共3本书籍,下面说下本次的活动规则:
1. 加入猿天地纯技术交流群,详情查看。
加入本群的朋友将有机会抽取其中一本书籍,目前群成员20人,中奖几率很高哦!
3. 在本文章下面留言,说出你想学习的理由(必须走心,随便说不会上墙),点赞数最高1位朋友中奖,赠送1本。点赞数统计也是截止到13号晚上6点。
点击图片查看更多推荐内容
↓↓↓
编程道路上的困难—怎么克服?
大牛坐镇|高端JAVA纯技术群你要加入吗?
Java做爬虫也很牛
以上是关于面试题之死锁解密的主要内容,如果未能解决你的问题,请参考以下文章