Java多线程编程:死锁示例

原创 男娘i 2024-09-28 00:45 239阅读 0赞

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

以下是一个简单的Java死锁示例:

  1. // 创建两个共享资源的类
  2. public class Resource {
  3. private boolean locked;
  4. public Resource() {
  5. this.locked = false;
  6. }
  7. // 为每个资源提供一个锁方法
  8. public synchronized void lock() {
  9. if (!locked) {
  10. locked = true;
  11. // 在这里添加需要锁定的资源代码,比如数据库连接等
  12. } else {
  13. System.out.println("Resource already locked.");
  14. }
  15. }
  16. // 解除锁的方法
  17. public synchronized void unlock() {
  18. if (locked) {
  19. locked = false;
  20. // 在这里添加解锁并释放资源的代码
  21. } else {
  22. System.out.println("Resource not locked.");
  23. }
  24. }
  25. }
  26. // 创建两个线程,每个线程尝试获取另一个线程持有的资源
  27. public class Main {
  28. private Resource resource1, resource2;
  29. public Main() {
  30. resource1 = new Resource();
  31. resource2 = new Resource();
  32. // 创建并启动第一个线程
  33. Thread thread1 = new Thread(() -> {
  34. System.out.println("Thread 1 started.");
  35. resource1.lock(); // 获取资源1
  36. try {
  37. Thread.sleep(500); // 暂停一段时间
  38. } catch (InterruptedException e) {
  39. e.printStackTrace();
  40. }
  41. // 在这里添加释放资源1并尝试获取资源2的代码
  42. System.out.println("Thread 1 attempting to lock resource 2.");
  43. resource2.lock(); // 尝试获取资源2
  44. try {
  45. Thread.sleep(500); // 暂停一段时间
  46. } catch (InterruptedException e) {
  47. e.printStackTrace();
  48. }
  49. System.out.println("Thread 1 unlocking resources.");
  50. resource1.unlock();
  51. resource2.unlock();
  52. System.out.println("Thread 1 completed.");
  53. }));
  54. // 创建并启动第二个线程
  55. Thread thread2 = new Thread(() -> {
  56. System.out.println("Thread 2 started.");
  57. resource2.lock(); // 获取资源2
  58. try {
  59. Thread.sleep(500); // 暂停一段时间
  60. } catch (InterruptedException e) {
  61. e.printStackTrace();
  62. }
  63. System.out.println("Thread 2 attempting to lock resource 1.");
  64. resource1.lock(); // 尝试获取资源1
  65. try {
  66. Thread.sleep(500); // 暂停一段时间
  67. } catch (InterruptedException e) {
  68. e.printStackTrace();
  69. }
  70. System.out.println("Thread 2 unlocking resources.");
  71. resource2.unlock();
  72. resource1.unlock();
  73. System.out.println("Thread 2 completed.");
  74. }));
  75. thread1.start(); // 启动第一个线程
  76. thread2.start(); // 同时启动第二个线程
  77. }
  78. }

在这个例子中,两个线程分别尝试获取对方持有的资源。由于每个资源都被锁定了,所以两个线程会陷入无限等待,从而形成死锁。

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

发表评论

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

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

相关阅读

    相关 Java线编程示例

    死锁是多线程编程中的一种严重问题,当两个或更多线程因争夺资源而造成的一种互相等待的现象时,就会出现死锁。 以下是一个简单的Java死锁示例,使用了两个共享资源(resourc

    相关 Java线编程示例

    在Java多线程编程中,死锁是一种常见的并发问题。当两个或更多的线程互相等待对方释放资源时,就形成了死锁。 以下是一个简单的Java死锁示例: ```java // 创建两