深入理解:Java多线程并发问题示例

原创 今天药忘吃喽~ 2024-12-07 05:03 258阅读 0赞

在Java中,多线程并发问题是编程中的常见挑战。主要涉及以下几种问题:

  1. 死锁:多个线程相互等待对方释放资源,导致所有线程都无法继续执行。

示例:

  1. class Resource {
  2. boolean locked;
  3. Resource() { locked = false; }
  4. }
  5. class ThreadA implements Runnable {
  6. Resource res;
  7. ThreadA(Resource res) { this.res = res; }
  8. @Override
  9. public void run() {
  10. res.locked = true;
  11. try {
  12. System.out.println("Thread A: waiting...");
  13. // 线程B等待ThreadA释放资源
  14. Thread.sleep(500);
  15. } finally {
  16. res.locked = false;
  17. System.out.println("Thread A: released resources");
  18. }
  19. }
  20. }
  21. class ThreadB implements Runnable {
  22. Resource res;
  23. ThreadB(Resource res) { this.res = res; }
  24. @Override
  25. public void run() {
  26. res.locked = true;
  27. try {
  28. System.out.println("Thread B: waiting for A...");
  29. // 线程A释放资源后,线程B尝试获取资源
  30. Thread.sleep(2000);
  31. } finally {
  32. res.locked = false;
  33. System.out.println("Thread B: released resources");
  34. }
  35. }
  36. }
  37. public class Main {
  38. public static void main(String[] args) {
  39. Resource res = new Resource();
  40. ThreadA threadA = new ThreadA(res);
  41. ThreadB threadB = new ThreadB(res);
  42. // 启动线程
  43. new Thread(threadA).start();
  44. new Thread(threadB).start();
  45. System.out.println("Main: exiting...");
  46. }
  47. }

在这个例子中,ThreadAThreadB是两个并发的线程。它们互为等待者和释放者,导致了死锁现象。

要避免死锁,通常需要遵循以下原则:

  • 一个资源被请求后,必须能够保持状态,以便在满足请求条件时再次使用。
  • 不要让一个线程永远等待另一个线程释放资源。
  • 建立适当的锁机制,确保在访问共享资源时不会互相干扰。
文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

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

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

相关阅读