美文网首页一些收藏
Java层面实现的锁 VS JVM实现的锁

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

作者: M_lear | 来源:发表于2022-02-28 14:58 被阅读0次

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的阻塞线程,没有效果。

  • WAITING状态
    线程阻塞在,等待另一个线程的某个动作发生。
    wait、join、park
  • TIMED_WAITING状态
    sleep、限时wait、限时join和限时park。
  • BLOCKED状态
    线程阻塞在,获取synchronized锁上。

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

相关文章

网友评论

    本文标题:Java层面实现的锁 VS JVM实现的锁

    本文链接:https://www.haomeiwen.com/subject/qeklrrtx.html