Java多线程同步问题:锁、信号量和条件变量实战

原创 曾经终败给现在 2024-09-19 11:51 220阅读 0赞

在Java多线程编程中,锁(Lock)、信号量(Semaphore)和条件变量(Condition Variable)是三种常用的同步工具。

  1. 锁(Lock):

    • synchronized关键字实现同步。
    • 适用于互斥访问资源的场景。
  2. 信号量(Semaphore):

    • 定义一个资源,资源数量有限。
    • 当线程需要使用资源时,通过wait()方法减小资源计数,然后进入等待状态;当资源可用时,通过signal()notifyAll()方法增加资源计数,唤醒等待的线程。
  3. 条件变量(Condition Variable):

    • 用于实现线程间的同步条件,比如:两个线程需要互斥执行某个操作,或者等待特定事件发生等场景。
    • 当满足某些条件时,线程可以通过wait()方法进入等待状态;当条件不满足或某个线程通知其他线程时,可以通过notifyAll()notify()方法唤醒等待的线程。

实战示例:

  1. import java.util.concurrent.locks.Condition;
  2. import java.util.concurrent.locks.Lock;
  3. import java.util.concurrent.locks.ReentrantLock;
  4. public class MultiThreadSynchronization {
  5. private final Lock lock = new ReentrantLock();
  6. private final Condition condition = lock.newCondition();
  7. public void syncWithSignal() throws InterruptedException {
  8. lock.lock();
  9. try {
  10. System.out.println("线程1等待...");
  11. // 线程2到达,通过条件变量唤醒线程1
  12. if (condition.signalAll()) {
  13. System.out.println("线程1被唤醒并执行...");
  14. // 模拟耗时操作
  15. Thread.sleep(3000);
  16. }
  17. } finally {
  18. lock.unlock();
  19. }
  20. }
  21. public static void main(String[] args) {
  22. MultiThreadSynchronization sync = new MultiThreadSynchronization();
  23. new Thread(() -> {
  24. try {
  25. sync.syncWithSignal();
  26. System.out.println("线程2执行完毕...");
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. // 在这里可以模拟其他操作,不影响主线程
  31. })).start();
  32. // 主线程等待子线程执行完毕
  33. try {
  34. Thread.sleep(5000);
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. }
  38. System.out.println("主线程执行完毕...");
  39. }
  40. }

在这个例子中,我们创建了两个线程:线程1线程2。线程1等待条件满足后(由线程2唤醒),执行耗时操作。

在主程序中,主线程会等待子线程执行完毕,然后执行自己的业务逻辑。

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

发表评论

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

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

相关阅读