Java多线程问题:死锁的实例

原创 落日映苍穹つ 2024-09-12 01:33 233阅读 0赞

死锁是多线程编程中的一种严重问题。当两个或更多的线程互相等待对方释放资源时,就会出现死锁。

以下是一个简单的死锁实例,使用了Java的Thread类:

  1. // 创建两个共享资源的线程
  2. class ResourceThread extends Thread {
  3. private Object resource;
  4. public ResourceThread(Object resource) {
  5. this.resource = resource;
  6. }
  7. @Override
  8. public void run() {
  9. try {
  10. while (!stopThread) { // 线程无限循环
  11. synchronized (resource) { // 对共享资源加锁
  12. if (requestResource(resource)) { // 如果申请到资源
  13. // 执行任务,然后释放资源
  14. doTask();
  15. resource.notifyAll(); // 通知等待的线程
  16. return;
  17. } else { // 如果未申请到资源,继续循环
  18. resource.wait(); // 等待其他线程释放锁
  19. }
  20. }
  21. }
  22. } catch (Exception e) {
  23. System.out.println("Thread " + getName() + " caught an exception: " + e);
  24. }
  25. }
  26. private boolean requestResource(Object resource) {
  27. synchronized (resource) {
  28. // 假设资源当前可用
  29. return resource.available();
  30. }
  31. }
  32. private void doTask() {
  33. System.out.println("Thread " + getName() + " is executing a task...");
  34. try {
  35. Thread.sleep(2000); // 模拟任务执行时间
  36. } catch (InterruptedException e) {
  37. System.out.println("Thread " + getName() + " interrupted while sleeping: " + e);
  38. }
  39. }
  40. public void stopThread() {
  41. System.out.println("Stopping thread " + getName());
  42. this.stop = true; // 设置线程停止标志
  43. }
  44. }
  45. // 创建两个共享资源的线程实例
  46. ResourceThread thread1 = new ResourceThread(new Object()));
  47. ResourceThread thread2 = new ResourceThread(new Object()));
  48. // 启动线程
  49. thread1.start();
  50. thread2.start();

在这个例子中,线程thread1thread2都试图获取一个共享资源。但是由于某种原因(例如资源有限),其中只有一个线程能成功获得资源。

如果两个线程同时尝试获取资源而一个已经获得了,那么就形成了死锁。在这个例子中,我们可以通过增加线程等待时间来模拟这种情况,从而观察到死锁现象。

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

发表评论

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

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

相关阅读

    相关 Java线问题实例

    死锁是多线程编程中的一种严重问题。当两个或更多的线程因争夺资源而造成的一种互相等待的现象时,就会出现死锁。 以下是一个简单的Java死锁实例: ```java // 创建两