ReentrantLock可重入锁

可重⼊锁,这个锁可以被线程多次重复进⼊进⾏获取操作。
ReentantLock继承接⼝Lock并实现了接⼝中定义的⽅法,除了能完成synchronized所能完成的所有⼯作 外,还提供了诸如可响应中断锁、可轮询锁请求、定时锁等避免多线程死锁的⽅法。
在并发量较⼩的多线程应⽤程序中,ReentrantLock与synchronized性能相差⽆⼏,但在⾼ 并发量的条件下,synchronized性能会迅速下降⼏⼗倍,⽽ReentrantLock的性能却能依然维持⼀个⽔ 准。
因此我们建议在⾼并发量情况下使⽤ReentrantLock。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Counter {
    private final Lock lock = new ReentrantLock();
    private int count = 0;

    public void increment() {
        lock.lock();  // 获取锁
        try {
            count++;
        } finally {
            lock.unlock();  // 释放锁
        }
    }

    public int getCount() {
        return count;
    }
    
    public static void main(String[] args) {
        Counter counter = new Counter();

        // 创建两个线程,模拟并发访问共享资源
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        t1.start();
        t2.start();

        // 等待两个线程执行完毕
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Final count is: " + counter.getCount());
    }
}
public class Counter {
    private int count = 0;

    // 使用 synchronized 关键字修饰方法,确保线程安全
    public synchronized void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }

    public static void main(String[] args) {
        Counter counter = new Counter();

        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Final count is: " + counter.getCount());
    }
}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-19 02:50:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-19 02:50:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-19 02:50:03       82 阅读
  4. Python语言-面向对象

    2024-06-19 02:50:03       91 阅读

热门阅读

  1. 十个案例让你彻底明白究竟什么是PyTorch

    2024-06-19 02:50:03       28 阅读
  2. 测试驱动开发TDD

    2024-06-19 02:50:03       26 阅读
  3. 力扣(2024.06.18)

    2024-06-19 02:50:03       26 阅读
  4. Linux下tar命令解压缩

    2024-06-19 02:50:03       26 阅读
  5. 打印mybatis的sql日志

    2024-06-19 02:50:03       23 阅读
  6. 计算机网络模型

    2024-06-19 02:50:03       23 阅读
  7. Result类忘记添加@Data注解导致406错误

    2024-06-19 02:50:03       25 阅读
  8. 深拷贝和浅拷贝

    2024-06-19 02:50:03       33 阅读
  9. 扩展学习|风险沟通研究进展综述

    2024-06-19 02:50:03       24 阅读
  10. 利用Python调用闲鱼商品详情API接口

    2024-06-19 02:50:03       25 阅读