Java多线程理解:死锁现象实例展示

原创 蔚落 2024-09-16 23:33 158阅读 0赞

死锁是多线程编程中的一个常见问题,它发生在两个或更多的线程互相等待对方释放资源的情况。

以下是一个简单的死锁现象实例展示:

  1. // 假设我们有四个资源A、B、C和D
  2. // 线程1(拥有资源A)需要资源B
  3. // 线程2(拥有资源B)需要资源A
  4. // 同时线程1等待线程2释放B,线程2等待线程1释放A
  5. public class DeadLockExample {
  6. private Object resourceA = new Object();
  7. private Object resourceB = new Object();
  8. public void thread1() {
  9. try {
  10. synchronized (resourceA) { // 获取A资源
  11. if (acquireResource(resourceB))) { // 如果获取到B资源,继续操作
  12. System.out.println("Thread 1: Acquired both A and B.");
  13. performTask(); // 执行任务
  14. releaseResource(resourceB); // 将B资源归还
  15. }
  16. else {
  17. System.out.println("Thread 1: Could not acquire resource B.");
  18. synchronized (resourceA) { // 再次获取A资源,循环等待
  19. }
  20. }
  21. }
  22. }
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. private boolean acquireResource(Object resource) throws InterruptedException {
  28. System.out.println("Thread 1: Acquiring resource " + resource);
  29. synchronized (resource) { // 获取锁,如果获取失败则返回false
  30. if (!resource.lock()) {
  31. return false;
  32. }
  33. System.out.println("Thread 1: Successfully acquired resource " + resource);
  34. return true; // 获取成功,返回true
  35. }
  36. }
  37. private void performTask() {
  38. try {
  39. Thread.sleep(2000); // 模拟耗时操作
  40. System.out.println("Thread 1: Completed task.");
  41. } catch (InterruptedException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. public static void main(String[] args) throws InterruptedException {
  46. DeadLockExample example = new DeadLockExample();
  47. Thread thread1 = new Thread(example::thread1));
  48. thread1.start(); // 启动线程1
  49. thread1.join(); // 等待线程1结束
  50. }
  51. }

这个例子中,两个线程A和B互斥地获取资源,导致死锁。通过输出日志信息,可以看到线程的执行过程。

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

发表评论

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

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

相关阅读