一些收藏

Java层面实现的锁 VS JVM实现的锁

2022-02-28  本文已影响0人  M_lear

JVM实现的锁,对应synchronized关键字。

Java层面实现的锁,对应为Lock接口和ReadWriteLock接口的实现类。

Lock接口:

public interface Lock {

    void lock();

    void lockInterruptibly() throws InterruptedException;

    boolean tryLock();

    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

    void unlock();

    Condition newCondition();
}

ReadWriteLock接口:

// 读读共享,读写互斥,写写互斥
public interface ReadWriteLock {

    Lock readLock();

    // 写锁保证修改对读锁可见
    Lock writeLock();
}

区别
Java层面实现的锁更加灵活:

  1. 线程阻塞在获取lock上时,允许被中断,退出阻塞状态,并抛出InterruptedException。(lockInterruptibly())
  2. 尝试性的tryLock,而不阻塞线程。
  3. 或者,限时阻塞的tryLock,同样允许被中断,退出阻塞状态,并抛出InterruptedException。
  4. 支持多个等待条件。
  5. 支持读写锁。

题外话:Java中断

线程的中断标志为true,可以让处于WAITING或TIMED_WAITING的阻塞线程,从阻塞状态中退出来。
但对于处于BLOCKED的阻塞线程,没有效果。

AQS的,线程阻塞和唤醒,最终都是基于Unsafe的park和unpark实现的。

上一篇 下一篇

猜你喜欢

热点阅读