理解和解决Java多线程并发问题示例

原创 偏执的太偏执、 2024-11-29 11:45 61阅读 0赞

在Java中,多线程并发问题主要涉及到线程同步、死锁、活锁等问题。下面是一些示例:

  1. 线程同步:通过synchronized关键字来实现线程互斥。例如:
  1. class Counter {
  2. private int count = 0;
  3. synchronized void increment() {
  4. count++;
  5. }
  6. synchronized int getCount() {
  7. return count;
  8. }
  9. }
  10. public class ThreadSyncExample {
  11. public static void main(String[] args) {
  12. Counter counter = new Counter();
  13. // 创建两个线程,分别增加和获取计数
  14. Thread threadIncrement = new Thread(() -> {
  15. for (int i = 0; i < 1000; i++) {
  16. counter.increment();
  17. }
  18. }));
  19. Thread threadGetCount = new Thread(() -> {
  20. for (int i = 0; i < 1000; i++) {
  21. System.out.println("Current count: " + counter.getCount());
  22. }
  23. }));
  24. // 启动线程
  25. threadIncrement.start();
  26. threadGetCount.start();
  27. // 等待所有线程执行完毕
  28. try {
  29. threadIncrement.join();
  30. threadGetCount.join();
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. }
  1. 死锁:当两个或更多线程相互等待对方持有的资源时,就会发生死锁。例如:
  1. class DeadlockExample {
  2. private Object lock1 = new Object();
  3. private Object lock2 = new Object();
  4. public void thread1() throws InterruptedException {
  5. synchronized (lock1) {
  6. System.out.println("Thread 1 acquired lock1");
  7. // 等待获取锁2
  8. synchronized (lock2) {
  9. System.out.println("Thread 1 acquired lock2");
  10. // 此时线程已经完成所有操作,释放资源
  11. lock2.notify();
  12. }
  13. }
  14. }
  15. public void thread2() throws InterruptedException {
  16. synchronized (lock2) {
  17. System.out.println("Thread 2 acquired lock2");
  18. // 等待获取锁1
  19. synchronized (lock1) {
  20. System.out.println("Thread 2 acquired lock1");
  21. // 此时线程已经完成所有操作,释放资源
  22. lock1.notify();
  23. }
  24. }
  25. }
  26. public static void main(String[] args) throws InterruptedException {
  27. DeadlockExample example = new DeadlockExample();
  28. Thread thread1 = new Thread(() -> {
  29. try {
  30. example.thread1();
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. }));
  35. Thread thread2 = new Thread(() -> {
  36. try {
  37. example.thread2();
  38. } catch (InterruptedException e) {
  39. e.printStackTrace();
  40. }
  41. }));
  42. // 启动线程
  43. thread1.start();
  44. thread2.start();
  45. // 等待所有线程执行完毕
  46. thread1.join();
  47. thread2.join();
  48. }
  49. }

以上示例展示了如何通过synchronized关键字避免死锁,并在两个线程中演示了同步操作。

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

发表评论

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

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

相关阅读