Java多线程并发问题:死锁和活锁示例

原创 喜欢ヅ旅行 2024-10-18 09:15 160阅读 0赞

在Java多线程编程中,死锁和活锁是两种常见的并发问题。下面将分别给出这两种情况的示例。

  1. 死锁示例:
  1. // 线程A拥有资源1,需要资源2
  2. class ThreadA extends Thread {
  3. private Resource resource1;
  4. private Resource resource2;
  5. public ThreadA(Resource resource1, Resource resource2) {
  6. this.resource1 = resource1;
  7. this.resource2 = resource2;
  8. }
  9. @Override
  10. public void run() {
  11. // 先获得资源1
  12. if (resource1.acquire()) {
  13. // 然后尝试获取资源2
  14. try {
  15. if (resource2.acquire()) {
  16. System.out.println("线程A成功,没有发生死锁");
  17. resource1.release();
  18. resource2.release();
  19. } else {
  20. System.out.println("线程A获取资源2失败,发生了死锁");
  21. resource1.release(); // 释放资源1,避免循环等待
  22. }
  23. } catch (InterruptedException e) {
  24. e.printStackTrace();
  25. }
  26. } else {
  27. System.out.println("线程A获取资源1失败,发生了死锁");
  28. }
  29. }
  30. }
  31. // 线程B拥有资源2,需要资源1
  32. class ThreadB extends Thread {
  33. private Resource resource1;
  34. private Resource resource2;
  35. public ThreadB(Resource resource1, Resource resource2) {
  36. this.resource1 = resource1;
  37. this.resource2 = resource2;
  38. }
  39. @Override
  40. public void run() {
  41. // 先获得资源2
  42. if (resource2.acquire()) {
  43. // 然后尝试获取资源1
  44. try {
  45. if (resource1.acquire()) {
  46. System.out.println("线程B成功,没有发生死锁");
  47. resource2.release();
  48. resource1.release();
  49. } else {
  50. System.out.println("线程B获取资源1失败,发生了死锁");
  51. resource2.release(); // 释放资源2,避免循环等待
  52. }
  53. } catch (InterruptedException e) {
  54. e.printStackTrace();
  55. }
  56. } else {
  57. System.out.println("线程B获取资源2失败,发生了死锁");
  58. }
  59. }
  60. }
  61. // 创建资源对象
  62. Resource resource1 = new Resource(1);
  63. Resource resource2 = new Resource(2);
  64. // 启动两个线程
  65. new ThreadA(resource1, resource2)).start();
  66. new ThreadB(resource1, resource2)).start();

在这个示例中,线程A和线程B分别拥有资源1和资源2。如果线程A获取到资源1后尝试获取资源2,同时线程B在获取到资源2后尝试获取资源1,那么这两个线程就会陷入死锁状态。

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

发表评论

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

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

相关阅读