解析java.util.concurrent锁[Java编程]
本文“解析java.util.concurrent锁[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
1. 导言
程序的性能解析是利用程序开辟历程中的一个重要方面.这个工作普通是由一些专业人员来完成的,他们的目标是在一个特定的平台上,提高代码的性能.当程序是运行在多核平台的多线程大概并路程序的时刻,提高性能这个问题就变得越发艰难了.因为在这样的情形下,不但需求考虑代码的性能,还需求考虑代码的可伸缩性.
随着Java 5中引入了java.util.concurrent (JUC)包,在Java语言中呈现了一种新的锁.JUC包利用得越来越广泛,因为更多的利用程序需求为了多核系统而开辟或细心地调优.固然JLM可以找到传统的Java锁的具体的竞争信息,但是却没有一样的工具可以找到java.util.concurrent.locks包的锁竞争信息. Sun/Oracle、IBM,还有其他Java厂商也都没有这样的工具.贫乏对JUC锁的解析工具恰是我们开辟这个锁工具,jucprofiler(Multicore SDK的一部份)的动机.
2. jucprofiler概览
当在程序中利用JUC锁的时刻,线程会在下面两种情形下“终止”履行:
当线程A试图去得到一个JUC锁,但这个锁却已经被别的一个线程得到,那么线程A不得不“终止”,直到这个锁被释放大概超时.
当线程A调用了java.util.concurrent.locks.Condition的肆意一个“等候”的API,线程A会终止履行,直到别的一个线程告诉它大概超时.
我们辨别把这两种情形称作“锁竞争时间”和“等候时间”.
jucprofiler就是为了捕捉以上两种情形的时间开销而计划和实现的.
2.1. 代码改正(Instruments)
为了获得JUC锁的运行时数据,需求提早改正一些JUC类,然后替换掉JRE中呼应的类.在初次利用jucprofiler之前,用户需求运行号令去生成PreInstrument.jar.假定JRE没有改变的话,这个步骤只需求做一次.(假如用户改变了JRE,那么用户需求自己删除 PreInstrument.jar,然后重新运行这个号令,来再次生成PreInstrument.jar).
2.1.1. 锁竞争时间开销
关于锁竞争时间开销,jucprofiler记录了申请类 java.util.concurrent.locks.AbstractQueuedSynchronizer 和类java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject的实例,并且给这些实例分配唯一的标识.
类 | 办法 | 调用位置 |
java.util.concurrent.locks.LockSupport | park (Object); | 类AbstractQueuedSynchronizer中的办法parkAndCheckInterrupt() |
parkNanos(Object blocker, long nanos) | 类AbstractQueuedSynchronizer中的办法doAcquireNanos(int arg, long nanosTimeout)与doAcquireSharedNanos(int arg, long nanosTimeout) |
2.1.2. 锁等候时间开销
关于锁等候时间开销,jucprofiler获得了在差别的位置调用类java.util.concurrent.locks.LockSupport的办法park(blocker)与parkNanos(blocker, nanos)的时间开销:
类 | 办法 | 调用位置 |
java.util.concurrent.locks.LockSupport | park (Object); | 类 AbstractQueuedSynchronizer除parkAndCheckInterrupt()以外的办法 |
parkNanos(Object blocker, long nanos) | 类AbstractQueuedSynchronizer除doAcquireNanos(int arg, long nanosTimeout)与doAcquireSharedNanos(int arg, long nanosTimeout) 以外的办法 |
以上是“解析java.util.concurrent锁[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |