JAVA同步Lock之ReentrantLock类简单使用

本文展示了一个使用Java实现的线程同步示例,通过ReentrantLock来控制两个线程A和B的并发执行,确保在共享资源上的操作是原子性的。每个线程将打印出自己的名称和迭代次数。
public class Main7 {

    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        Thread7 threadA = new Thread7(lock);
        threadA.setName("A");
        Thread7 threadB = new Thread7(lock);
        threadB.setName("B");
        threadA.start();
        threadB.start();
    }

    public static class Thread7 extends Thread{

        private Lock lock;

        public Thread7(Lock lock) {
            this.lock = lock;
        }

        @Override
        public void run() {
            super.run();
            lock.lock();
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread().getName() + ":"  + i);
            }
            lock.unlock();
        }
    }
}

 

### JavaLock接口与ReentrantLock的区别及用法 #### Lock接口概述 `Lock` 是 `java.util.concurrent.locks` 包中的一个重要接口,提供了一种更灵活的方式来管理线程间的互斥访问。相比内置的同步机制(如 `synchronized`),`Lock` 接口允许程序显式地获取和释放锁,并且提供了更多高级功能[^2]。 #### ReentrantLock介绍 作为 `Lock` 接口的主要实现之一,`ReentrantLock` 支持可重入锁定行为——即持有某个对象关联锁的线程可以在不被阻塞的情况下重新请求相同的锁。这使得编写复杂的并发结构变得更加容易,因为开发人员不必担心死锁等问题的发生[^4]。 #### 主要区别 - **语法差异** - 使用 `synchronized` 关键字时不需要手动创建锁实例;而使用 `ReentrantLock` 需要先声明并初始化一个具体的锁对象。 - **公平性选项** - `ReentrantLock` 可配置为公平模式或非公平模式,默认是非公平模式下运行更快但可能会导致某些等待时间较长的任务永远得不到执行的机会。相比之下,`synchronized` 总是以不公平的方式工作。 - **额外的方法支持** - `tryLock()` 方法尝试立即获得锁而不必无限期地挂起当前线程; - `lockInterruptibly()` 允许其他线程通过中断方式打断正在试图获取锁的操作; - 还有超时版本的 `tryLock(long timeout, TimeUnit unit)` 来指定最大等待时限等特性[^1]。 #### 使用示例 下面是一个简单的例子展示了如何利用 `ReentrantLock` 实现基本的加解锁逻辑: ```java import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Counter { private int count = 0; private final Lock lock = new ReentrantLock(); public void increment() { lock.lock(); try { count++; } finally { lock.unlock(); } } public int getCount() { return count; // 此处无需加锁,假设只读取不会影响计数准确性 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值