ReentrantLock

简介: ReentrantLock

重入锁指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。在释放的时候,也需要相应的释放n次

synchronized 和 ReentrantLock 都是可重入锁。

可重入锁的意义之一在于防止死锁。

构造方法如图所示:默认实现的是非公平锁

 

基本使用



new Thread(){
            @Override
            public void run() {
                super.run();
                //state 由0->1 至此同一线程的锁变成无锁状态
                reentrantLock.lock();
                System.out.println(Thread.currentThread().getId());
                set();
                //state 由1->0 至此同一线程的锁变成无锁状态
                reentrantLock.unlock();
            }
        }.start(); 
public static void set() {
        //第二个断点打在这 state 1->2
        reentrantLock.lock();
        System.out.println(Thread.currentThread().getId());
        //2->1
        reentrantLock.unlock();
    }

 

第一次 state=0 if成立

setExclusiveOwnerThread将当前线程和这把锁进行绑定,防止其他线程占有

进入set方法 也就是第二个lock,很显然这里就不是0了 所以走else


public final void acquire(int arg) {
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }
    //这里为啥进入了非公平锁的获取是因为在构造ReentranLock时如果是空构造函数,
    //就是非公平锁 后面会将公平锁和非公平锁的底层原理
protected final boolean tryAcquire(int acquires) {
            return nonfairTryAcquire(acquires);
        }
        ///来到了ReentrantLock的nonfairTryAcquire具体实现方法 先获取state 还是先比较state是不是0 如果不是 就比较当前线程是不是绑定的线程
        //是的话state+1
final boolean nonfairTryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0) // overflow
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }



目录
相关文章
|
8月前
|
安全 Java
ReentrantLock、ReentrantReadWriteLock、StampedLock讲解
ReentrantLock、ReentrantReadWriteLock、StampedLock讲解
|
1月前
|
Java 开发者
ReentrantLock
ReentrantLock
13 1
|
1月前
|
存储 设计模式 安全
理解 AQS 和 ReentrantLock
在多线程编程中,同步机制是确保线程安全的关键。AQS(AbstractQueuedSynchronizer)和ReentrantLock是Java中两种常见的同步机制,它们各自具有不同的特性和适用场景。了解和掌握这两种机制对于编写高效、安全的并发程序至关重要。这篇文章将带你取了解和掌握这两种机制!另外值得一提的是:公平锁的实现与非公平锁是很像的,只不过在获取锁时不会直接尝试使用CAS来获取锁。只有当队列没节点并且state为0时才会去获取锁,不然都会把当前线程放到队列中。
125 1
|
8月前
ReentrantLock和Synchronized简单比较
ReentrantLock和Synchronized简单比较
28 0
|
Java
16.ReentrantLock全解读
大家好,我是王有志。今天和大家一起聊聊ReentrantLock,它是我们最常见的基于AQS实现的互斥锁。
79 0
|
缓存 Java Linux
ReentrantLock、ReentrantReadWriteLock、StampedLock
ReentrantLock、ReentrantReadWriteLock、StampedLock
ReentrantLock、ReentrantReadWriteLock、StampedLock
|
Java 容器 安全
ReentrantLock详解
本博客主要讲述ReentrantLock的实现原理,主要内容包括: AQS原理以及实现过程。 ReenetrantLock获取锁、释放锁流程,以及原理。 ReenetrantLock源码分析。
6098 1
ReentrantLock介绍
ReentrantLock介绍
133 0
|
Java
彻底理解ReentrantLock可重入锁的使用
java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析一下ReentrantLock。
161 0
彻底理解ReentrantLock可重入锁的使用
|
存储 设计模式 Java
深入理解ReentrantLock
同步锁synchronized和重入锁ReentrantLock都是用于并发程序设计必不可少的手段,在JDK 5.0早期版本中,同步锁性能远远低于重入锁,但是在6.0版本之后,jdk对同步锁做了大量的优化,使得同步锁跟重入锁性能差距并不大,并且jdk团队表示,同步锁还有进一步升级优化的空间
深入理解ReentrantLock