实例演示:Java多线程同步问题

原创 雨点打透心脏的1/2处 2024-10-10 05:39 155阅读 0赞

在Java中,多线程同步是确保多个线程在同一资源上安全工作的关键。以下是关于Java多线程同步问题的实例演示:

  1. 使用synchronized关键字
  1. // 示例类
  2. public class Counter {
  3. private int count = 0;
  4. // 同步方法,只允许一个线程访问count变量
  5. public synchronized void increment() {
  6. count++;
  7. }
  8. // 获取当前计数
  9. public synchronized int getCount() {
  10. return count;
  11. }
  12. }
  1. 使用wait()和notifyAll()
  1. // 示例类,包含两个共享的锁对象
  2. public class Counters {
  3. private Lock lock1 = new ReentrantLock();
  4. private Lock lock2 = new ReentrantLock();
  5. // 共享计数器方法
  6. public void incrementCounter(int counterId) {
  7. lock(counterId).lock(); // 获取对应锁
  8. try {
  9. if (counterId == 1) { // 如果是第一个计数器
  10. System.out.println("Counter 1 incremented.");
  11. synchronized (lock2) { // 同步第二个锁,以便通知其他线程
  12. lock2.notifyAll();
  13. }
  14. } else { // 如果是其他计数器
  15. System.out.println("Counter " + counterId + " incremented.");
  16. }
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. } finally {
  20. lock(counterId).unlock(); // 释放对应锁
  21. }
  22. }
  23. // 同步方法,用于通知所有线程某个计数器已更新
  24. private void notifyAllCounters(int counterId) {
  25. lock(counterId).lock();
  26. try {
  27. synchronized (lock2) { // 同步第二个锁,以便通知其他线程
  28. lock2.notifyAll();
  29. }
  30. } catch (InterruptedException e) {
  31. e.printStackTrace();
  32. } finally {
  33. lock(counterId).unlock(); // 释放对应锁
  34. }
  35. }
  36. }

在这个例子中,我们有两个共享的计数器(counterId为1和2),并使用了ReentrantLock作为同步机制。通过wait()和notifyAll()方法,我们可以实现对共享资源的安全访问。

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

发表评论

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

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

相关阅读

    相关 Java线编程:同步问题演示

    在Java多线程编程中,同步问题是常见的挑战。这里我们将通过一个简单的例子来演示同步问题。 **示例:共享资源的多个线程** 假设我们有一个共享变量`count`,初始值为

    相关 Java线同步问题演示

    在Java中,多线程同步是一个重要的概念,它确保了多个线程在访问共享资源时的一致性和线程安全。以下是一些常见的多线程同步问题的演示和解决方案。 ###1.共享资源的竞态条件*