千家信息网

java引发死锁的情况有哪些

发表于:2024-09-23 作者:千家信息网编辑
千家信息网最后更新 2024年09月23日,这篇"java引发死锁的情况有哪些"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"ja
千家信息网最后更新 2024年09月23日java引发死锁的情况有哪些

这篇"java引发死锁的情况有哪些"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"java引发死锁的情况有哪些"文章吧。

四种情况

1、交叉锁导致程序死锁:比如线程A持有R1的锁等待R2的锁,线程B持有R2的锁等待R1的锁

2、内存不足:比如两个线程T1和T2,T1已获取10MB内存,T2获取了15MB内存,T1和T2都需要获取30MB内存才能工作,但是剩余可用的内存为10MB,这样两个线程都在等待彼此释放内存资源

3、一问一答式的数据交换:服务器开启某个端口,等待客户端访问,客户端发送请求后,服务器因某些原因错过了客户端请求,导致客户端等待服务器回应,而服务器等待客户端发送请求

4、死循环引起的死锁:比较常见,使用jstack等工具看不到死锁,但是程序不工作,CPU占有率高,这种死锁也叫系统假死,难以排查和重现

实例

public class Main {    private final Object MUTEX_READ = new Object();    private final Object MUTEX_WRITE = new Object();     public void read(){        synchronized (MUTEX_READ){            synchronized (MUTEX_WRITE){            }        }    }     public void write(){        synchronized (MUTEX_WRITE){            synchronized (MUTEX_READ){            }        }    }     public static void main(String[] args) throws InterruptedException {        Main m = new Main();        new Thread(()->{            while (true){                m.read();            }        }).start();        new Thread(()->{            while (true){                m.write();            }        }).start();    }}

以上就是关于"java引发死锁的情况有哪些"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

0