Java多线程并发问题实例解析

原创 灰太狼 2024-09-06 04:36 194阅读 0赞

在Java编程中,多线程并发是一个常见的挑战。这里我们将通过几个具体的实例来解析这些并发问题。

  1. 资源竞争
    当两个或多个线程同时访问和修改一个共享资源(如变量、文件等)时,就会出现资源竞争的问题。

    1. // 示例:共享变量 count,多线程同时更新
    2. public class Counter {
    3. private int count = 0;
    4. public synchronized void increment() {
    5. count++;
    6. notifyAll(); // 唤醒等待的线程
    7. }
    8. public synchronized int value() {
    9. return count;
    10. }
    11. }
  2. 死锁
    当两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象称为死锁。

    1. // 示例:两个线程同时请求资源 A 和 B,但先获得资源 A 的线程会等待获取资源 B,从而陷入死锁
    2. public class DeadlockExample {
    3. private Object resourceA = new Object();
    4. private Object resourceB = new Object();
    5. public void thread1() {
    6. synchronized (resourceA) {
    7. // 先获得资源 A
    8. System.out.println("Thread 1 acquires A");
    9. // 等待资源 B
    10. try {
    11. synchronized (resourceB) {
    12. // 确保 B 被正确获取,否则会死锁
    13. System.out.println("Thread 1 waits for B");
    14. }
    15. } catch (InterruptedException e) {
    16. e.printStackTrace();
    17. }
    18. // 执行任务后释放资源 A
    19. System.out.println("Thread 1 releases A");
    20. // 现在可以获取资源 B
    21. synchronized (resourceB) {
    22. // 获取并使用资源 B
    23. System.out.println("Thread 1 acquires B");
    24. }
    25. }
    26. }
    27. public void thread2() {
    28. synchronized (resourceB) {
    29. // 先获得资源 B,线程会等待
    30. System.out.println("Thread 2 acquires B");
    31. // 等待资源 A
    32. try {
    33. synchronized (resourceA) {
    34. // Thread 2 需要等待 Thread 1 释放资源 A
    35. System.out.println("Thread 2 waits for A");
    36. }
    37. } catch (InterruptedException e) {
    38. e.printStackTrace();
    39. }
    40. // 执行任务后释放资源 B
    41. synchronized (resourceB) {
    42. // 此时可以获取并使用资源 B
    43. System.out.println("Thread 2 releases B");
    44. // 现在可以获取资源 A
    45. synchronized (resourceA) {
    46. // 获取并使用资源 A
    47. System.out.println("Thread 2 acquires A");
    48. }
    49. }
    50. }
    51. }
    52. public static void main(String[] args) {
    53. DeadlockExample example = new DeadlockExample();
    54. Thread thread1 = new Thread(example::thread1));
    55. Thread thread2 = new Thread(example::thread2));
    56. // 启动线程
    57. thread1.start();
    58. thread2.start();
    59. // 等待所有线程完成
    60. while (thread1.is_alive() || thread2.is_alive()) {
    61. try {
    62. // 休眠一会儿,防止一直阻塞
    63. Thread.sleep(100);
    64. } catch (InterruptedException e) {
    65. e.printStackTrace();
    66. }
    67. }
    68. System.out.println("All threads completed.");
    69. }
    70. }

这个例子展示了两个线程(Thread 1 和 Thread 2)共享资源 A 和 B,从而可能导致死锁。

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

发表评论

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

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

相关阅读