谈谈解决多线程安全问题中使用synchronized和ReentrantLock 的区别

使用synchronized和ReentrantLock 的区别都能够解决多线程安全问题,但是两者到底有什么区别了?

    1. synchronized是一个关键字而ReentrantLock是一个类
    1. synchronized可以自动释放锁而ReentrantLock需要手动释放锁
    1. 两者都是可重⼊锁。
“可重⼊锁”概念是:⾃⼰可以再次获取⾃⼰的内部锁。⽐如⼀个线程获得了某个对
象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不
可锁重⼊的话,就会造成死锁。同⼀个线程每次获取锁,锁的计数器都⾃增1,所以要等到锁的计数器
下降为0时才能释放锁。
    1. synchronized不可以中断且是非公平锁而ReentrantLock可以设置锁的状态(为公平锁还是非公平锁)
“非公平锁”是指多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。

优点:可以减少CPU唤醒线程的开销,整体的吞吐效率会高点,CPU也不必取唤醒所有线程,会减少唤起线程的数量。
缺点:你们可能也发现了,这样可能导致队列中间的线程一直获取不到锁或者长时间获取不到锁,导致饿死。

“公平锁”是指多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。
优点:所有的线程都能得到资源,不会饿死在队列中。
缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。
    1. 当执行执行多线程所涉及的同步代码量较多时建议使用ReentrantLock锁,而涉及代码量较少时可以使用synchronized锁
    1. synchronized 依赖于 JVM ⽽ ReentrantLock 依赖于 API

你可能感兴趣的:(谈谈解决多线程安全问题中使用synchronized和ReentrantLock 的区别)