Java多线程:死锁问题实例解析

原创 ゝ一纸荒年。 2024-10-22 12:30 128阅读 0赞

死锁是多线程编程中的一种严重问题。当两个或更多的线程在执行过程中,因争夺资源而造成的一种互相等待的现象时,就会出现死锁。

下面是一个简单的死锁问题实例:

  1. // 线程1
  2. class Thread1 extends Thread {
  3. private Object lockA = new Object();
  4. private Object lockB = new Object();
  5. public void run() {
  6. synchronized (lockA) { // 获取锁A
  7. System.out.println("Thread 1: Acquiring A...");
  8. try {
  9. // 操作资源
  10. Thread.sleep(2000); // 等待2秒
  11. } catch (InterruptedException e) {
  12. e.printStackTrace();
  13. }
  14. System.out.println("Thread 1: Released A...");
  15. }
  16. synchronized (lockB) { // 获取锁B
  17. System.out.println("Thread 1: Acquiring B...");
  18. try {
  19. // 操作资源
  20. Thread.sleep(2000); // 等待2秒
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. System.out.println("Thread 1: Released B...");
  25. }
  26. }
  27. }
  28. // 线程2
  29. class Thread2 extends Thread {
  30. private Object lockA = new Object();
  31. private Object lockB = new Object();
  32. public void run() {
  33. synchronized (lockA) { // 获取锁A
  34. System.out.println("Thread 2: Acquiring A...");
  35. try {
  36. // 操作资源
  37. Thread.sleep(1000); // 等待1秒
  38. } catch (InterruptedException e) {
  39. e.printStackTrace();
  40. }
  41. System.out.println("Thread 2: Released A...");
  42. }
  43. synchronized (lockB) { // 获取锁B
  44. System.out.println("Thread 2: Acquiring B...");
  45. try {
  46. // 操作资源
  47. Thread.sleep(1000); // 等待1秒
  48. } catch (InterruptedException e) {
  49. e.printStackTrace();
  50. }
  51. System.out.println("Thread 2: Released B...");
  52. }
  53. }
  54. }
  55. public class Main {
  56. public static void main(String[] args) {
  57. Thread1 thread1 = new Thread1();
  58. Thread2 thread2 = new Thread2();
  59. // 启动线程
  60. thread1.start();
  61. thread2.start();
  62. }
  63. }

在这个例子中,线程1试图获取锁A和B,而线程2也试图获取锁A和B。由于它们同时竞争这两把锁,就会导致死锁现象。

要避免这种情况,通常需要设计合理的资源分配策略,确保在并发情况下不会出现相互等待的条件。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,128人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java线实例

    在Java编程中,死锁是一种常见的多线程问题。当两个或更多的线程互相等待对方释放资源时,就会导致死锁。 下面以一个简单的银行账户转账场景来剖析死锁的实例: 1. 线程A:拥

    相关 Java线实例

    在Java多线程编程中,死锁是一种常见的并发问题。下面我们将通过一个具体的例子来解析死锁。 假设我们有两个线程A和B,它们都需要两个资源:资源1(由线程C持有)和资源2(由线