多线程挑战:Java并发编程中的死锁示例?

原创 逃离我推掉我的手 2024-10-27 23:00 126阅读 0赞

在Java并发编程中,死锁是一种常见的问题。当两个或更多的线程互相等待对方释放资源时,就会发生死锁。

以下是一个简单的Java代码示例,展示了如何创建并陷入死锁:

  1. // 创建两个互有依赖的线程
  2. class ThreadA implements Runnable {
  3. private Object resourceA = new Object();
  4. @Override
  5. public void run() {
  6. try {
  7. // 线程A需要资源B才能继续
  8. synchronized (resourceA) {
  9. System.out.println("Thread A acquires resource A");
  10. // 现在线程A尝试获取资源B
  11. synchronized (ThreadB.resourceB) {
  12. System.out.println("Thread A acquires resource B");
  13. // 如果资源B已经被其他线程占用,就会导致死锁
  14. if (ThreadB.isResourceBOccupied()) {
  15. throw new InterruptedException("Deadlock occurred due to resource contention.");
  16. }
  17. }
  18. // 线程A释放资源B
  19. synchronized (ThreadB.resourceB) {
  20. ThreadB.releaseResourceB();
  21. System.out.println("Thread A releases resource B");
  22. }
  23. }
  24. } catch (InterruptedException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. class ThreadB implements Runnable {
  30. private Object resourceB = new Object();
  31. private boolean isResourceBOccupied() {
  32. // 模拟资源B已经被其他线程占用
  33. return true;
  34. }
  35. @Override
  36. public void run() {
  37. try {
  38. // 线程B需要资源A才能继续
  39. synchronized (ThreadA.resourceA) {
  40. System.out.println("Thread B acquires resource A");
  41. // 如果资源A已经被其他线程占用,就会导致死锁
  42. if (ThreadA.isResourceAOccupied()) {
  43. throw new InterruptedException("Deadlock occurred due to resource contention.");
  44. }
  45. }
  46. // 线程B释放资源A
  47. synchronized (ThreadA.resourceA) {
  48. ThreadA.releaseResourceA();
  49. System.out.println("Thread B releases resource A");
  50. }
  51. } catch (InterruptedException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }
  56. public class DeadlockExample {
  57. public static void main(String[] args) {
  58. // 创建线程A和B
  59. ThreadA threadA = new ThreadA();
  60. ThreadB threadB = new ThreadB();
  61. // 启动线程A和B
  62. new Thread(threadA).start();
  63. new Thread(threadB).start();
  64. }
  65. }

在这个示例中,线程A需要资源B才能继续(ThreadA.resourceAThreadB.resourceB),同时线程B也需要资源A才能继续。这就导致了两个线程互相等待对方释放资源,从而陷入了死锁。

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

发表评论

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

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

相关阅读