Synchronized和Lock的异同

1synchronizedJVM层面的实现的,JVM会确保释放锁,而且synchronized使用简单;而Lock是个普通类,需要在代码中finally显式释放锁lock.unlock(),但是使用灵活

2synchronized采用的是悲观锁机制,(不管读或写)线程获得独占锁,而其他线程只能阻塞来等待释放锁。当竞争激烈时CPU频繁的上下文切换会降低效率。而Lock乐观锁机制,读的时候可以并发读,写只能单线程。当竞争激烈时JVM可以花更少的时间来调度线程,把更多时间用在执行线程上,因此性能最佳在资源竞争不是很激烈的情况下,synchronized优于lock,资源竞争激烈时,synchronized性能急剧下降,lock差别不大。synchronize在语义上很清晰,可以进行很多优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。

3ReentrantLock可以实现定时锁、轮询锁,可以选择放弃等待或者轮询请求。有效防止了死锁。

[java]  view plain  copy
  1. lock();//用来获取锁,如果锁已被其他线程获取,则进行等待  
  2. tryLock(); //尝试获取锁,若成功返回true,失败(即锁已被其他线程获取)则返回false  
  3. tryLock(long timeout, TimeUnit unit); //在拿不到锁时会等待一定的时间  
  4. //两个线程同时通过lock.lockInterruptibly()想获取某个锁时  
  5. //若线程A获取到了锁,而线程B在等待  
  6. //线程B调用threadB.interrupt()方法能够中断线程B的等待过程  
  7. lockInterruptibly();  

4synchronized是非公平锁。而ReentrantLock可以通过构造函数传入true实现公平锁,即按照申请锁顺序获得锁。

5ReentrantLock类有一个重要的函数newCondition(),用于获取Lock上的一个条件,Condition可用于线程间通信。


4. 可重入锁

synchronized以及Lock类锁,两者都是可重入锁

[java]  view plain  copy
  1. class MyClass {  
  2.     public synchronized void method1() {  
  3.         method2();  
  4.     }  
  5.     public synchronized void method2() {      
  6.     }  
  7. }  

可重入锁的意思是,当一个线程执行到某个synchronized方法时,比如说method1,而在method1中会调用另外一个synchronized方法method2,此时线程不必重新去申请锁,而是可以直接执行方法method2假如synchronized不具备可重入性,此时线程A需要重新申请锁。但是线程A已经持有了该对象的锁,这样线程A会一直等待永远不会获取到的锁。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值