Lock锁

 ReentrantLock vs synchronized

  • synchronized内置java关键字。Lock是一个java类
  • synchronized无法判断获取锁的状态,Lock可以判断是否获得到了锁
  • synchronized会自动释放锁,lock锁必须要手动释放,如果不释放会死锁。
  • synchronized线程1获得锁(一直不释放锁),线程2傻傻的等。lock锁tryLock就不一定一直等待。【trylock有两种用法,一种是不带参数:不设置等待时间,获取失败立即返回false。另一种是带等待时间的,线程会先挂起等待设置的时间结束如果还未获取到锁则返回false】
  • synchronized可重入锁,非公平。lock可重入锁,可以判断锁,可以是公平锁。
  • synchronized适合少量的代码同步问题,lock适合大量的同步代码。
  • 在竞争不是很激烈的情况下,也就是线程数量比较少的情况下,sychornized的性能要优于lock,但是在竞争很激烈的情况下 。 sychornized的性能会下降,lock的性能能维持常态。
  • lock只能锁代码块;synchronized可以锁代码块+方法锁
public class ReentrantLockTest {
    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        try {
            lock.lock();
        } finally {
            lock.unlock();
        }
    }
}

 

Condition VS synchronized

 Condition精准的通知和唤醒线程。

线程通信-生产者消费者模式-【测试1-Condition VS synchronized】

彻底理解锁

  1. 对于普通同步方法,锁是当前实例对象
  2. 对于静态同步方法,锁是当前类的Class对象
  3. 对于同步方法块,锁是synchronized括号里配置的对象

 

 

 

posted @ 2022-06-18 12:50  禁止摆烂  阅读(249)  评论(0)    收藏  举报