理解并发编程中的Java问题:死锁实例

原创 我就是我 2024-10-16 03:48 88阅读 0赞

在并发编程中,死锁是一个常见的Java问题。简单来说,死锁是多个进程或线程因争夺资源而造成的一种互相等待的现象,且没有任何一方能继续执行下去。

以下是一个简单的死锁实例,使用Java编写:

  1. // 假设我们有两个线程和两个资源
  2. class Resource {
  3. boolean available = true;
  4. void acquire() {
  5. if (available) {
  6. available = false;
  7. System.out.println("Thread " + 1 + " acquired resource");
  8. } else {
  9. throw new RuntimeException("Resource is already acquired");
  10. }
  11. }
  12. void release() {
  13. if (!available) {
  14. throw new RuntimeException("Resource was not acquired by this thread");
  15. }
  16. available = true;
  17. System.out.println("Thread " + 1 + " released resource");
  18. }
  19. }
  20. class ThreadA implements Runnable {
  21. Resource res1;
  22. public ThreadA(Resource res1) {
  23. this.res1 = res1;
  24. }
  25. @Override
  26. public void run() {
  27. try {
  28. res1.acquire();
  29. System.out.println("Thread A finished executing");
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. } finally {
  33. res1.release();
  34. }
  35. }
  36. }
  37. class ThreadB implements Runnable {
  38. Resource res2;
  39. public ThreadB(Resource res2) {
  40. this.res2 = res2;
  41. }
  42. @Override
  43. public void run() {
  44. try {
  45. res2.acquire();
  46. System.out.println("Thread B finished executing");
  47. } catch (Exception e) {
  48. e.printStackTrace();
  49. } finally {
  50. res2.release();
  51. }
  52. }
  53. }
  54. public class Main {
  55. public static void main(String[] args) {
  56. Resource res1 = new Resource();
  57. Resource res2 = new Resource();
  58. ThreadA threadA = new ThreadA(res1);
  59. ThreadB threadB = new ThreadB(res2);
  60. // 启动线程
  61. threadA.start();
  62. threadB.start();
  63. }
  64. }

在这个例子中,ThreadA和ThreadB都试图同时获取res1和res2这两个资源。由于它们互斥(即一个进程不能同时拥有两个资源),所以当一个进程尝试获取另一个已经获得的资源时,就会发生死锁。

为了防止这种情况的发生,通常会使用锁(Lock)或信号量(Semaphore)等并发控制机制来管理共享资源。

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

发表评论

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

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

相关阅读