已知:
我们在网上查阅资料时会发现,自旋优化是用在轻量级锁中的,当自旋超过n次,则升级为重量级锁.
有一种新的自旋操作是自适应自旋,即根据过往经验,判断自旋判断标准中的n具体为多少.
求解:
现在的问题是既然锁的升级是单向的,那么自适应锁怎么会得到过往经验呢?按理说升级为重量级锁之后就不会再降级为轻量级锁,也就不会再面临自旋次数的选择了.也就是说这个次数的判定只会出现一次,感觉逻辑上出了点问题,希望能得到大家的回答.
我又重新看了《深入理解java虚拟机》给的定义,"如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也很有可能再次成功,进而允许自旋等待持续相对更长的时间",我的理解如下:
这里我原来将一段同步代码块看作一个锁,但实际上在java中锁的单位应该是对象锁或类锁,也就是说,一个对象锁可能对应很多同步代码块,当然,由于我们编程的习惯以及代码本身来说,用同一把锁锁住的代码块往往具有相似性,也就是应用场景相似,所以可以借用上次的经验,这个过程中是同一个线程和同一个对象(对象锁)的对应关系,并不是从上一个线程获得的经验。
经验应该是根据之前自旋获取锁的经验,判断之前自旋是否是很少获得锁,判断当前获取锁的线程是否在运行,获取锁的概率有多大,应该是这样吧。
首先、你这个问题提问的非常好,一看就是一个喜欢深度思考的极客,勾起了我回答的欲望
其次、自旋锁是适合执行任务时间较短的任务;
然后、这种情况下,只依靠线程本身肯定不行的,线程本身是用来执行任务的,肯定是不能分心干这些活,这些活都是由JVM来进行判断的;
最后、当一个线程进入自旋锁时发现:上一个线程自旋获取锁成功,并且还在运行中,那么大概率通过增加自旋当前线程也能获取到锁,这时就会增加自旋时间。
希望能帮助到你,望采纳。