Java多线程困惑:死锁示例

原创 快来打我* 2024-10-17 06:51 219阅读 0赞

在Java编程中,理解多线程的死锁问题是非常重要的。以下是一个经典的死锁示例:

示例代码(使用Java语法):

  1. // 定义两个线程资源
  2. class Resource1 {
  3. int count = 5;
  4. synchronized void use() {
  5. if (count > 0) {
  6. count--;
  7. System.out.println("Resource1 used by Thread " + Thread.currentThread().getName());
  8. } else {
  9. System.out.println("Resource1 is out of stock.");
  10. }
  11. }
  12. }
  13. class Resource2 {
  14. int count = 5;
  15. synchronized void use() {
  16. if (count > 0) {
  17. count--;
  18. System.out.println("Resource2 used by Thread " + Thread.currentThread().getName());
  19. } else {
  20. System.out.println("Resource2 is out of stock.");
  21. }
  22. }
  23. }
  24. // 线程1想要使用资源1
  25. class ThreadA extends Thread {
  26. Resource1 resource1;
  27. public ThreadA(Resource1 resource1) {
  28. this.resource1 = resource1;
  29. }
  30. @Override
  31. public void run() {
  32. try {
  33. // 资源1被线程A占用,其他线程等待资源释放
  34. resource1.use();
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }
  40. // 线程2想要使用资源2,但资源1已被线程A占用
  41. class ThreadB extends Thread {
  42. Resource2 resource2;
  43. public ThreadB(Resource2 resource2) {
  44. this.resource2 = resource2;
  45. }
  46. @Override
  47. public void run() {
  48. try {
  49. // 资源2被线程B占用,但资源1仍被线程A占用
  50. resource2.use();
  51. } catch (InterruptedException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }
  56. // 两个线程同时尝试获取并使用各自需要的资源
  57. public class DeadLockExample {
  58. public static void main(String[] args) {
  59. Resource1 resource1 = new Resource1();
  60. ThreadA threadA = new ThreadA(resource1);
  61. ThreadB threadB = new ThreadB(resource2);
  62. // 启动两个线程
  63. threadA.start();
  64. threadB.start();
  65. }
  66. }

在这个示例中,当线程A试图使用资源1时(但资源1被线程B占用),它会被阻塞。同理,线程B在尝试使用资源2时也会被阻塞。

由于两个线程都在等待对方释放资源,这就形成了一个死锁循环。因此,如果需要避免这种情况,就需要对多线程的并发控制进行设计和处理。

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

发表评论

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

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

相关阅读

    相关 Java线编程:示例

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

    相关 理解Java线示例

    在Java编程中,多线程是一种资源管理和任务调度的重要方式。然而,如果管理不当,就可能出现各种问题,如死锁。 死锁是两个或更多的线程在执行过程中,因争夺资源而造成的一种互相等

    相关 Java线问题:示例

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