多线程并发:Java线程同步死锁案例 原创 落日映苍穹つ 2024-09-18 01:03 13阅读 0赞 在Java编程中,多线程并发和线程同步是两个重要的概念。下面我们将通过一个死锁的例子来深入理解。 首先,了解什么是死锁: - 死锁:两个或更多的线程因争夺资源而造成的一种互相等待的现象,若无外力干涉无法继续执行任何操作。 现在我们来看一个Java死锁案例: ```java // 线程1 public class Thread1 extends Thread { private Object lockA = new Object(); private Object lockB = new Object(); public void run() { synchronized (lockA) { // 获取锁A System.out.println("Thread1: Acquired lockA"); try { // 代码块 synchronized (lockB) { // 同时获取锁B System.out.println("Thread1: Attempting to acquire lockB"); if (Thread.currentThread() != lockB.getOwner()) { // 如果线程不是锁的当前拥有者,则等待 lockB.acquire(); System.out.println("Thread1: Acquired lockB after waiting"); } else { System.out.println("Thread1: LockB is already acquired by " + lockB.getOwner())); } } catch (InterruptedException e) { System.out.println("Thread1: InterruptedException occurred in lockB acquire"); Thread.currentThread().interrupt(); } } finally { // 无论是否获取锁,都需要释放 synchronized (lockA) { lockA.release(); System.out.println("Thread1: Released lockA"); } synchronized (lockB) { lockB.release(); System.out.println("Thread1: Released lockB"); } } } // 获取锁A释放 } public static void main(String[] args) { Thread1 thread1 = new Thread1(); thread1.start(); // 创建另一个线程尝试获取锁A Thread2 thread2 = new Thread2(thread1); thread2.start(); } } // 线程2,尝试获取锁A public class Thread2 extends Thread { private Object lockA = new Object(); public Thread2(Thread1 parentThread) { this.parentThread = parentThread; } public void run() { try { // 获取锁A synchronized (lockA) { System.out.println("Thread2: Attempting to acquire lockA from " + parentThread); if (parentThread != null && !parentThread.isLockAAcquired()) { // 如果线程不是父线程,且没有获取锁A,则尝试获取锁 lockA.acquire(); System.out.println("Thread2: Acquired lockA successfully"); // 设置父线程的锁状态 if (parentThread != null) { parentThread.setLockAAcquired(true); System.out.println("Thread2: Set parent thread's lockA state to true"); } } else { // 如果线程是父线程或已经获取了锁,那么尝试获取锁会失败 System.out.println("Thread2: Failed to acquire lockA from " + parentThread + ", already acquired by the parent thread."); } } } catch (InterruptedException e) { System.out.println("Thread2: InterruptedException occurred in lockA acquire"); Thread.currentThread().interrupt(); } } } ``` 在这个例子中,线程1获取了锁A后试图获取锁B。但是线程2,作为另一个线程,也尝试获取锁A。由于线程1已经在等待线程2释放锁A时才进行尝试,所以当线程2尝试获取锁A时,会发现已被线程1占用,从而引发死锁。 在实际编程中,为了避免死锁的发生,需要遵循以下原则: 1. 互斥:资源在被访问的时刻必须是独占的。 2. 不剥夺:进程一旦获得了资源就不能被剥夺。 3. 非循环等待:任何时刻不存在循环等待的关系。 文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。
相关 多线程并发:Java线程同步死锁案例 在Java编程中,多线程并发和线程同步是两个重要的概念。下面我们将通过一个死锁的例子来深入理解。 首先,了解什么是死锁: - 死锁:两个或更多的线程因争夺资源而造成的一种互相 落日映苍穹つ/ 2024年09月18日 01:03/ 0 赞/ 14 阅读
相关 Java多线程编程:同步锁和死锁案例 Java多线程编程中,同步锁主要有两种方式:synchronized关键字和Lock接口。 1. `synchronized`关键字: ```java // 假设有一个共享 迷南。/ 2024年09月17日 14:57/ 0 赞/ 13 阅读
相关 Java多线程问题:线程同步与死锁 在Java多线程编程中,线程同步和死锁是两个关键概念。 1. **线程同步**: - 同步是为了保证多个线程访问共享资源(如内存、文件等)时的顺序性和一致性。 - 曾经终败给现在/ 2024年09月16日 06:03/ 0 赞/ 18 阅读
相关 Java多线程同步问题:死锁案例分析 在Java多线程编程中,死锁是一种严重的线程同步问题。下面我们将通过一个经典的死锁案例进行分析。 案例:银行和ATM机的场景 - **两个线程**: - 1号线程( 小灰灰/ 2024年09月12日 09:24/ 0 赞/ 22 阅读
相关 Java多线程问题:线程同步与死锁 在Java多线程编程中,线程同步和死锁是两个关键概念。 1. 线程同步: - **synchronized关键字**:这是Java中最常用的同步机制。在一个方法或者代码 太过爱你忘了你带给我的痛/ 2024年09月10日 16:45/ 0 赞/ 29 阅读
相关 多线程之线程同步、lock锁、死锁 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ub 蔚落/ 2022年10月23日 11:15/ 0 赞/ 231 阅读
相关 Java多线程同步死锁例程 在计算机领域有一个很经典的问题——哲学家进餐问题。在一个桌子旁边,围坐着五个哲学家,每个哲学家左右手边各有一支筷子。要求每个哲学家必须同时拿起两支筷子才可以吃饭。开始吃饭的时候 川长思鸟来/ 2022年06月17日 13:51/ 0 赞/ 200 阅读
相关 java多线程死锁死锁案例 / 两个线程先分别持有两把锁,然后再去请求对方的锁,导致死锁 / public class DeadLock extends Thread 蔚落/ 2022年03月14日 11:18/ 0 赞/ 361 阅读
相关 Java多线程死锁案例 产生死锁的原因 就是,两个线程互相等待着对象释放锁,一直这样僵持下去,所以导致了死锁的产生,下面这个代码就会产生一个死锁: package com.exampl 落日映苍穹つ/ 2021年12月20日 04:09/ 0 赞/ 309 阅读
还没有评论,来说两句吧...