Java多线程-Lock详解

概述

  • 对象锁
    • 一般指synchronized,和对象有关
    • 每个对象都有个隐形的监视器,用于线程的同步
    • 线程状态:创建(new)->就绪(start)->运行(run)->阻塞(lock/wait/join/sleep)->销毁
  • ReentrantLock
    • 互斥锁
    • 可重入
  • Condition
    • 实现wait,notify,notifyAll的功能
  • ReadWriteLock - ReentrantReadWriteLock
    • 共享锁:读读共享

ReentrantLock

  • synchronized的功能增强版;JDK 1.5之前性能优于synchronized;现在性能相差不多

// 简单用法
public static ReentrantLock lock = new ReentrantLock();
    try {
        lock.lock();
        i++;
    } finally {
        lock.unlock(); // 保证异常情况下也释放;synchronized由JVM释放
    }
  • 可重入
    • 获取计数器,锁几次,就需要释放几次
  • 可中断
    • lock.lock()
      • 不能响应中断
      • 在park时被中断,park会解除,设置interrupt标识,但是不抛异常,线程继续
    • lock.lockInterruptibly()
      • 能响应中断
      • 被lock.lockInterruptibly() block的线程,收到interrupt信号时,会抛出InterruptedException,进而退出
  • 可限时
    • lock.tryLock(long timeout, TimeUnit unit),超时返回false
  • 公平锁
    • 默认非公平
      • 先尝试抢占,再排队
    • 公平
      • 直接排队
      • public ReentrantLock(boolean fair)
    • synchronized是非公平锁

Condition

public static ReentrantLock lock = new ReentrantLock();
public static Condition condition = lock.newCondition();
  • lock内部维护一个同步队列
    • 同步队列头的类型是AbstractQueuedSynchronizer
  • condition内部维护一个条件队列
    • 条件队列头的类型为AbstractQueuedSynchronizer$ConditionObject
  • 一个lock可以有多个condition,即多个条件队列
  • 持锁者才可以执行await
    • 因为await中有release的逻辑,会抛IllegalMonitorStateException
  • co
  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eddy咸鱼

感谢大佬加鸡蛋~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值