java锁

Posted jyzyz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java锁相关的知识,希望对你有一定的参考价值。

---恢复内容开始---

synchronized 互斥锁

synchronized(this) 当前类的所有synchronized(this) 都被锁了,还有synchronized static也一样

 

synchronized代码块实际上多了monitorenter和monitorexit两条指令。monitorenter指令执行时会让对象的锁计数加1,而monitorexit指令执行时会让对象的锁计数减1

 

对于synchronized方法或者synchronized代码块,当出现异常时,JVM会自动释放当前线程占用的锁,因此不会由于异常导致出现死锁现象;
synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法。

 

锁从宏观上分为乐观锁和悲观锁

synchronized是悲观锁,认为写多,对读也加锁,retreentlock通过cas获取锁,获取不到才转为悲观锁。

CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。

 

synchronized是重量级锁,争用不到锁的线程会进入阻塞状态。重量级锁是悲观锁的一种。

 

java1.5引用偏向锁和轻量锁,默认启动了自旋锁,这些都属于乐观锁。

 

自旋锁:如果持有锁的线程能在段时间内释放,那么等待竞争锁的线程就不做用户态与内核态的切换。避免了切换的消耗。他会做自选,这样也是会消耗cpu的,所以,应该设置一个自旋等待时间,如果过了时间还没得到锁就进入线程阻塞状态。

适用于,锁竞争不激烈,且用所时间非常短的代码块。

jdk1.7以后,是否开启自旋锁,由JVM控制,时间阈值也是自适应的,一般和线程上下文切换的时间差不多。

 

 

偏向锁是在无锁争用的情况下使用的,也就是同步开在当前线程没有执行完之前,没有其它线程会执行该同步块,一旦有了第二个线程的争用,偏向锁就会升级为轻量级锁,如果轻量级锁自旋到达阈值后,没有获取到锁,就会升级为重量级锁

以上是关于java锁的主要内容,如果未能解决你的问题,请参考以下文章

Java锁机制(Synchronized)[无锁偏向锁轻量级锁重量级锁]

最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁

最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁

(转)java并发对象锁类锁私有锁

Java锁synchronized关键字学习系列之偏向锁升级

JAVA锁相关知识总结