使用lock 加锁,和使用 synchronized 加锁。没拿到锁的线程,状态是不同的。 线程如果没有竞争到 synchronized 锁,会呈现出blocked阻塞状态 线程如果没有竞争到 Lock 锁,会呈现出waiting等待状态 来用代码演示看看,先看看synchronized锁状态: staticSheepLocklock=newSheepLock();publicstaticvoidmain(String[] args)thro...
区别如下: 1. lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现;(具体实现上的区别在《Java虚拟机》中有讲解底层的CAS不同,以前有读过现在又遗忘了。) 2. synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释...
对于代码块的Synchronized是通过monitorenter 和monitorexit实现的,关于其可重入的实现类似后面讲到的AQS中的state,进入+1,退出-1,monitor计数为0 代表可获取锁状态; 对于方法上Synchronized的实现,会对该方法增加ACC_SYNCHRONIZED 标识符,碰到该标识符表示访问时也需先获取monitor,本质是一样的,不过是一种隐式的实现。