深入理解Java的并发控制工具:Locks、Conditionals与Semaphore的应用示例

原创 曾经终败给现在 2024-12-09 15:21 168阅读 0赞

在Java中,我们有三种主要的并发控制工具:Locks(锁)、Conditionals(条件变量)和Semaphore(信号量)。下面我将给出它们各自的应用示例。

  1. Locks(锁)

应用示例:

  1. // 使用ReentrantLock创建一个可重入的锁
  2. import java.util.concurrent.locks.ReentrantLock;
  3. public class UnlockExample {
  4. private ReentrantLock lock = new ReentrantLock();
  5. public void methodThatUsesLock() {
  6. lock.lock(); // 获取锁
  7. try {
  8. // 执行任务代码
  9. System.out.println("Doing something critical...");
  10. } finally {
  11. // 无论是否发生异常,都要释放锁
  12. lock.unlock();
  13. }
  14. }
  15. public static void main(String[] args) {
  16. UnlockExample unlockExample = new UnlockExample();
  17. Thread thread1 = new Thread(() -> unlockExample.methodThatUsesLock()));
  18. Thread thread2 = new Thread(() -> unlockExample.methodThatUsesLock()));
  19. thread1.start(); // 启动第一个线程
  20. thread2.start(); // 启动第二个线程
  21. // 等待两个线程执行完毕
  22. thread1.join();
  23. thread2.join();
  24. System.out.println("Both threads completed execution.");
  25. }
  26. }

在这个例子中,我们创建了一个使用ReentrantLock的类。在方法中,我们首先获取锁,然后执行任务代码,最后无论是否发生异常,都要释放锁。

  1. Conditionals(条件变量)

应用示例:

  1. import java.util.concurrent.locks.Condition;
  2. import java.util.concurrent.locks.Lock;
  3. import java.util.concurrent.locks.ReentrantLock;
  4. public class ConditionalExample {
  5. private Lock lock = new ReentrantLock();
  6. private Condition condition = lock.newCondition();
  7. public void methodWithConditional() {
  8. lock.lock(); // 获取锁
  9. try {
  10. // 设置条件
  11. condition.signalAll();
  12. // 任务代码
  13. System.out.println("Doing something conditional...");
  14. } finally {
  15. // 无论是否发生异常,都要释放锁
  16. lock.unlock();
  17. }
  18. }
  19. public static void main(String[] args) {
  20. ConditionalExample conditionalExample = new ConditionalExample();
  21. Thread thread1 = new Thread(() -> conditionalExample.methodWithConditional()));
  22. Thread thread2 = new Thread(() -> conditionalExample.methodWithConditional()));
  23. thread1.start(); // 启动第一个线程
  24. thread2.start(); // 启动第二个线程
  25. // 等待两个线程执行完毕
  26. thread1.join();
  27. thread2.join();
  28. System.out.println("Both threads completed execution.");
  29. }
  30. }

在这个例子中,我们创建了一个具有Condition的类。在方法中,我们首先获取锁,然后设置条件,触发所有等待的线程,最后无论是否发生异常,都要释放锁。

  1. Semaphore(信号量)

应用示例:

  1. import java.util.concurrent.locks.Semaphore;
  2. public class SemaphoreExample {
  3. private Semaphore semaphore = new Semaphore(2); // 创建一个允许最多两个线程通过的信号量
  4. public void methodWithSemaphore() throws InterruptedException {
  5. semaphore.acquire(); // 获取信号量,如果信号量值为0,则会阻塞当前线程直到其他线程释放了该信号量
  6. try {
  7. // 任务代码
  8. System.out.println("Doing something with Semaphore...");
  9. } finally {
  10. // 无论是否发生异常,都要尝试释放信号量
  11. semaphore.release();
  12. }
  13. }
  14. public static void main(String[] args) {
  15. SemaphoreExample semaphoreExample = new SemaphoreExample();
  16. Thread thread1 = new Thread(() -> semaphoreExample.methodWithSemaphore()));
  17. Thread thread2 = new Thread(() -> semaphoreExample.methodWithSemaphore()));
  18. thread1.start(); // 启动第一个线程
  19. thread2.start(); // 启动第二个线程
  20. // 等待两个线程执行完毕
  21. thread1.join();
  22. thread2.join();
  23. System.out.println("Both threads completed execution.");
  24. }
  25. }

在这个例子中,我们创建了一个带有Semaphore的类。在方法中,我们首先获取信号量,如果信号量值为0,则会阻塞当前线程直到其他线程释放了该信号量,然后执行任务代码,最后无论是否发生异常,都要尝试释放信号量。

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

发表评论

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

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

相关阅读