Java多线程同步工具Lock、Synchronized及ReentrantLock的对比实例

原创 ╰+哭是因爲堅強的太久メ 2024-11-28 20:45 90阅读 0赞

在Java中,多线程同步主要通过Lock接口实现,包括Lock(旧锁)、LockSupport.lock()(原生锁定)和ReentrantLock(重入锁)等。

下面以一个简单的生产者消费者场景来对比这些工具:

  1. 使用synchronized关键字:

    1. public class SimpleSync {
    2. private int count = 0;
    3. public synchronized void producer() {
    4. count++;
    5. System.out.println("Producer: Count " + count);
    6. try {
    7. wait();
    8. } catch (InterruptedException e) {
    9. e.printStackTrace();
    10. }
    11. }
    12. public synchronized void consumer() {
    13. System.out.println("Consumer: Will consume " + count);
    14. if (count > 0) {
    15. count--;
    16. producer();
    17. notifyAll();
    18. }
    19. }
    20. }
  2. 使用Lock接口:
    ```java
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;

public class SimpleLock {
private int count = 0;
private Lock lock;

  1. public SimpleLock() {
  2. lock = new ReentrantLock();
  3. }
  4. public void producer() {
  5. lock.lock();
  6. try {
  7. count++;
  8. System.out.println("Producer: Count " + count);
  9. wait();
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. } finally {
  13. lock.unlock();
  14. }
  15. }
  16. public void consumer() {
  17. lock.lock();
  18. try {
  19. System.out.println("Consumer: Will consume " + count);
  20. if (count > 0) {
  21. count--;
  22. producer();
  23. notifyAll();
  24. }
  25. } catch (InterruptedException e) {
  26. e.printStackTrace();
  27. } finally {
  28. lock.unlock();
  29. }
  30. }

}
```
对比示例中,synchronized关键字用于实现线程同步,而Lock接口提供了更细粒度的控制。

ReentrantLock是Lock接口的一个具体实现,它支持重入(即同一个线程再次进入相同锁代码块)这一特性。

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

发表评论

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

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

相关阅读