交叉锁不仅是指自己写的代码出现了交叉的情况,如果使用某个框架或者开源库,由于对源码API的不熟悉,很有可能也会引起死锁,由于使用不当而出现后者死锁,排查的困难则要高于前者,所以在使用框架或者开源库的时候做到了如指掌还是很有必要的。示例代码如下:
package com. wangwenjun. concurrent. chapter04;
import static java. lang. Thread. currentThread;
public class DeadLock
{
private final Object MUTEX READ=new Object();
private final Object MUTEX WRITE=new Object();
public void read()
{
synchronized (MUTEX READ)
{
System. out. println(currentThread(). getName()+'
synchronized (MUTEX WRITE)
{
System. out. print1n(currentThread(). getName()
}
System. out. println(currentThread(). getName()+'
}
System. out. println(currentThread(). getName()+"re]
}
public void write()
{
synchronized (MUTEX_WRITE)
{
System. out. print1n(currentThread(). getName()+'
synchronized(MUTEX_READ)
{
System. out. println(currentThread(). getName()
}
System. out. println(currentThread(). getName()+'
}
System. out. print1n(currentThread(). getName()+"rel
}
public static void main(String[] args)
{
final DeadLock deadLock=new DeadLock();
new Thread(()->
{
while(true)
{
deadLock. read();
}
},"READ-THREAD"). start();
new Thread(()->
{
while(true)
{
deadLock. write();
}
},"WRITE-THREAD"). start();
}
}
上面的程序再明显不过了,一眼就可以看出程序有死锁的风险,如果使用一些开源库,API的调用层次比较深,那么看代码是不容易发现死锁风险的,比155如JDK中的HashMap,文档很明显地指出了该数据结构不是线程安全的类。
如果在多线程同时写操作的情况下不对其进行同步化封装,则很容易出现死循环引起的死锁,程序运行一段时间后CPU等资源高居不下,各种诊断工具很难派上用场,因为死锁引起的进程往往会榨干CPU等几乎所有资源,诊断工具由于缺少资源一时间也很难启动。以上就是关于Java程序由于交叉锁引起的死锁情况的举例。