Java-锁:ReentrantLock底层原理

本文详细介绍了Java中的可重入锁ReentrantLock,包括它的可重入特性、与synchronized的区别、公平锁与非公平锁的概念,以及加锁流程。ReentrantLock提供了等待可中断、公平锁选择和绑定多个条件等高级功能。
摘要由CSDN通过智能技术生成

ReentrantLock

1.什么是可重入锁?

即一个线程持有某个对象的锁时,再次去获取这个对象的锁可以成功的。

ReentrantLock是个典型的独占模式AQS,同步状态为0时表示空闲。当有线程获取到空闲的同步状态时,它会将同步状态加1,将同步状态改为非空闲,于是其他线程挂起等待。在修改同步状态的同时,并记录下自己的线程,作为后续重入的依据,即一个线程持有某个对象的锁时,再次去获取这个对象的锁是可以成功的。

2.ReentrantLock的特点

ReentrantLock锁相对于Synchronized锁的高级功能,

  1. 等待可中断:指当前持有所得线程长期不释放锁的时候,等待的线程可以选择放弃等待,改为处理其他事情。

将lockInterruptibly() 放到代码块中,调用interrupt方法进行中断时,lockInterruptibly()会立即响应。

        @ReservedStackAccess
        final void lockInterruptibly() throws InterruptedException {
   
            if (Thread.interrupted())
                throw new InterruptedException();
            if (!initialTryLock())
                acquireInterruptibly(1);
        }
  1. 公平锁:指多个线程在等待同一锁时,当锁可用时,必须按照申请锁的时间顺序来依次获取锁。
  2. 锁绑定多个条件:相对于synchronized 的object.notify() , object.notifyAll() 只能随机唤醒一个,或者全部唤醒。
    ReentrantLock唤醒线程时可以有选择的唤醒。
public void threadDemo2() {
   

		Lock lock = new ReentrantLock();
		Condition c1 = lock.newCondition();
		Condition c2 = lock.newCondition();
		

		new Thread(new Runnable() {
   

			@Override
			public void run() {
   
				// TODO Auto-generated method stub
				lock.lock();
				for (int i = 'A'; i < 'K'; i++) {
   

					while (state != 1) {
   
						try {
   
							c1.await();				
						} catch (InterruptedException e) {
   
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					System.out.print((char) i + " ");
					state = 2;
					c2.signal();
				}
				lock.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值