程序员

2020-12-08  本文已影响0人  Travis_Wu

一、锁的种类

二、获取和释放 monitor 锁的时机

线程在进入被 synchronized 保护的代码块之前,会自动获取锁,并且无论是正常路径退出,还是通过抛出异常退出,在退出的时候都会自动释放锁

看一组伪代码

public synchronized void method() {
    method body
}

等同于

public void method()  {
    this.intrinsicLock.lock();
    try {
        method body
    } finally {
        this.intrinsicLock.unlock();
    }
}

进入 method 方法后,立刻添加内置锁并 且用 try 代码块把方法保护起来,最后用 finally 释放这把锁

三、synchronized 和 Lock 异同

四、Lock 中的常用方法

五、为何要选择非公平锁

ReentrantLock默认就是非公平的,如果要让它变成公平锁,则在new构造器的时候需要传入参数true
注意:这里的非公平并不是指完全的随机,不是说线程可以任意插队,而是仅仅“在合适的时机”插队

六、读写锁 ReadWriteLock

在没有读写锁之前,我们假设使用普通的 ReentrantLock,那么虽然我们保证了线程安全 但是也浪费了一定的资源,因为如果多个读操作同时进行,其实并没有线程安全问题 我们可以允许让多个读操作并行,以便提高程序效率。

七、自旋锁

八、JVM 对锁进行了哪些优化?

上一篇 下一篇

猜你喜欢

热点阅读