黑马程序员技术交流社区
标题:
【广州校区】+ 多线程死锁产生的原因
[打印本页]
作者:
jianhong
时间:
2018-12-29 19:48
标题:
【广州校区】+ 多线程死锁产生的原因
本帖最后由 jianhong 于 2018-12-29 19:49 编辑
当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁,代码实现如下:
public class
Deadlock {
/**
* 下面的代码就是一个完整的死锁程序,程序中有两个线程,线程1锁住了str1,获得锁之后休眠1秒钟,这个时候线程2锁住了str2,也进行休眠操作。
线程1休眠完了之后去锁str2,但是str2已经被线程2给锁住了,这边只能等待,同样的道理,线程2休眠完之后也要去锁str1,同样也会等待,这样死锁就产生了。
*/
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()
;
}
}
上面代码运行结果为:
Thread-0锁住 str1
Thread-1锁住 str2
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2