Java多线程 ReentrantLock锁的使用 lock()、tryLock()、lockInterruptibly()

java基础(jdk1.8)

**

多线程—ReentrantLock使用

**

此篇博客主要讲如何使用ReentrantLock

本篇链接


ReentrantLock的简介

ReentrantLock是Java的一个类

底层使用CAS

ReentrantLock锁可以代替synchronized,而且控制更加方便
但线程数小于等于2的时候(简单模型)使用synchronized

方法

  • lock();

加锁,但必须必须必须手动释放锁
syn锁定如果遇到异常的时候,jvm会自动释放锁,但lock必须手动释放锁,因此常在finally内进行锁的释放unlock();

  • tryLock();

尝试加锁,不管锁定与否,方法都继续执行
boolean类型返回值,true表示拿到锁,false表示没有拿到锁
tryLock(时间长度,时间单位);等待给定时间长度,如果还拿不到锁,继续执行

  • lockInterruptibly();

同lock,可加锁,但可以对interrupt()方法做出响应
也就是其他线程调用当前用此方法等待线程的interrupt方法可以打断阻塞状态

    ReentrantLock o1 = new ReentrantLock();
	//普通加锁
	public void method1(){
        o1.lock();
        System.out.println("method1  加锁区间");
        o1.unlock();
    }
    //尝试加锁
    public void method2(){
        o1.tryLock();
        System.out.println("method2  加锁区间");
        o1.unlock();
    }
    //尝试加锁  (1s拿不到锁继续执行)
    public void method3(){
    	boolean flag = false;
        try {
            flag = o1.tryLock(1,TimeUnit.SECONDS);
            if (flag == true)
            {
	            System.out.println("method3  加锁区间");        
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
			if (flag == true) o1.unlock();
        }
    }
    //相应打断式加锁
    public void method4(){
        try {
            o1.lockInterruptibly();
            System.out.println("method4  加锁区间");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            o1.unlock();
        }
    }

公平锁

reentrantLock可以指定为公平锁

ReentrantLock rl = new ReentrantLock(true);

synchronized是非公平锁。等待某资源的所有线程都是等概率拿到锁
公平锁则是对等待线程的等待时间进行计时,保证公平,谁等待时间长谁拿锁

公平锁效率较非公平差

ReentrantLock详解

与synchronized比较

  • 使用

synchronized是Java关键字,而ReentrantLock是类

  • 加锁方式

synchronized加的是对象锁,是锁膨胀的一个过程,锁膨胀不可逆

ReentrantLock是通过方法加锁,底层是CAS+AQS

  • 公平锁

ReentrantLock可以指定公平锁,默认非公平。

synchronized是非公平锁

  • 响应

ReentrantLock可以尝试加锁,获不获得锁都会继续执行,且可以指定等待获取锁的时间。还可以指定对Interrupter做出相应

synchronized必须拿到锁才能执行,而且synchronized无法指定锁的获取时间

  • 释放

ReentrantLock必须手动释放锁

synchronized会自动释放锁

在这里插入图片描述

上一篇 》Synchronized、volatile及原子操作类使用


下一篇 》死锁

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值