Synchronized与Lock区别

Java里面的两种管程模型
之前我们了解了Java里面的一种管程模型monitor,synchronized就是基于Monitor实现的管程模型,在这个模型里面,synchronized中用锁解决了资源互斥问题,然后提供了wait(),notify(),notifyAll() 一组方法解决了线程同步问题,Java里面另一种管程模型就是Lock+Condition, 在此模型中 Lock是用来解决资源互斥的问题,而Condition里也提供wait(),signal(),signalAll() 同样也是解决线程同步问题.

Synchronized和Lock的区别

  1. Lock提供了超时机制

超时机制可以让我们更灵活的控制程序,而不必陷入等待锁的死循环中,在一定时间内获取不到锁,线程就释放出来继续干下面的事情,而synchronized一旦尝试加锁,就会死等,所以这种情况就有可能会出现死锁。方法是tryLock(long timeout,TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;

  1. Lock阻塞的线程可以响应中断

synchronized线程一旦获取锁失败就会进行阻塞,而阻塞状态下的线程是无法响应中断(Interrupted)的,而Lock是支持中断响应的. 方法是 lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断。

  1. Lock支持非阻塞的获取锁

Lock支持不阻塞的方式获取锁,以这种方式获取锁时会返回获取锁是否成功,当尝试获取锁不成功时,线程并不会阻塞。tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;

  1. Lock+Condition可以支持多个条件

synchronized只有一个等待队列,任何情况的阻塞都是放在一个队列里面的,Lock可以创建多个Condition队列,不同的Condition控制不同的条件,每个Condition有单独的一个队列.

  1. synchronized关键字油虚拟机实现, Lock是对象

  2. synchronized 当程序正常结束或者异常了都会释放锁, lock 需要自行释放

发布了213 篇原创文章 · 获赞 35 · 访问量 85万+

猜你喜欢

转载自blog.csdn.net/u012957549/article/details/105473479
今日推荐