问题描述
网上的解释大同小异,不易理解。我只想知道羡慕两个问题:1.并发包中的ReentrantLock是偏向锁河轻量级锁码?2.偏向锁跟可重入性有什么区别,非偏向锁如何实现可重入?
解决方案
解决方案二:
哈哈,这个很复杂的说,要看源码,而且对并发要很熟悉。看情况啦,具我了解是这样的,1、ReentrantLock是偏向锁还是轻量级锁首先他是乐观锁,然后实现了偏向锁的功能。如果线程已经获得锁,那么ReentrantLock有偏向锁的功能。2、偏向锁跟可重入性有什么区别?都是锁的一种特性,或者功能加强。没什么大的关系,如果不可重入,那什么偏向锁就不可能存在了。CAS实现的称为乐观锁。有了轻量锁,在考虑偏向的功能。偏向锁是在没有多个线程竞争时的功能加强,字面理解就是偏向这个线程。二种锁使用的场景不同。还有一点,偏向锁的一个缺点,或者一种开销。如果又有一个线程争用锁,那要需释放偏向锁,这个过程会带来一些开销。总体来说有偏向锁比没有的好多。这方面并没有深入了解,主要是应用和偶尔写些东西,比如自己写个线程池玩玩。像偏向锁、非阻塞队列的现实,这些都不是一时半会能理解的。如果上面说的有错误,请见谅,最好自己参考下各种文献。
解决方案三:
1.并发包中的ReentrantLock是偏向锁河轻量级锁码?是的。2.偏向锁跟可重入性有什么区别,非偏向锁如何实现可重入?偏向锁和可重入性直接没啥关系。。当然要是锁不具备可重入性,那就无所谓偏向了。可重入性是指比如一个线程获得了对象A上的锁,如果它第二次请求A的锁必然可以获得(也就是说不会自己把自己锁住),可重入性是线程必须满足的,不然很多代码就会死锁了偏向锁是说如果线程请求一个自己已经获得的锁,它不会去再次执行lock和unlock,这样可以提升性能。如何实现可重入都是一样的,就是把锁的拥有者记下来,当申请锁的时候看一下锁是否已经被占有了,如果有人占着锁,看看是不是就是申请者自己。
解决方案四:
该回复于2014-09-22 08:47:24被版主删除
解决方案五:
引用1楼yxsmzzwa的回复:
哈哈,这个很复杂的说,要看源码,而且对并发要很熟悉。看情况啦,具我了解是这样的,1、ReentrantLock是偏向锁还是轻量级锁首先他是乐观锁,然后实现了偏向锁的功能。如果线程已经获得锁,那么ReentrantLock有偏向锁的功能。2、偏向锁跟可重入性有什么区别?都是锁的一种特性,或者功能加强。没什么大的关系,如果不可重入,那什么偏向锁就不可能存在了。CAS实现的称为乐观锁。有了轻量锁,在考虑偏向的功能。偏向锁是在没有多个线程竞争时的功能加强,字面理解就是偏向这个线程。二种锁使用的场景不同。还有一点,偏向锁的一个缺点,或者一种开销。如果又有一个线程争用锁,那要需释放偏向锁,这个过程会带来一些开销。总体来说有偏向锁比没有的好多。这方面并没有深入了解,主要是应用和偶尔写些东西,比如自己写个线程池玩玩。像偏向锁、非阻塞队列的现实,这些都不是一时半会能理解的。如果上面说的有错误,请见谅,最好自己参考下各种文献。
感觉ReentrantLock的偏向实现跟JDK6的默认实现不一样。JDK6就像你上面说的,如果另外一个线程竞争锁,则将偏向锁升级,有一种将偏向锁功能限制在无竞争场景的感觉。而ReentrantLock好像锁对于持有者来说不管在什么情况下,都是偏向的。
解决方案六:
楼主问题问的好,楼上回答说的好。1.是2.可重入是最基本的条件。偏向锁是对单线程的优化。