Java 多线程同步问题的探究(三、Lock来了,大家都让开【1. 认识重入锁】)
2010-05-14 00:00:00 来源:WEB开发网核心提示: 从修改后的运行结果来看,显然,Java 多线程同步问题的探究(三、Lock来了,大家都让开【1. 认识重入锁】)(3),由于同步块的对象锁不同了,三个线程的执行顺序也发生了变化,这没问题(而且与异常处理交互得很好),但是,在一个线程释放第一个同步块的同步锁之后,第二个线程就可以进入第一个同步块
从修改后的运行结果来看,显然,由于同步块的对象锁不同了,三个线程的执行顺序也发生了变化。在一个线程释放第一个同步块的同步锁之后,第二个线程就可以进入第一个同步块,而此时,第一个线程可以继续执行第二个同步块。这样,整个执行过程中,有10秒钟的时间是两个线程同时工作的。另外十秒钟分别是第一个线程执行第一个同步块的动作和最后一个线程执行第二个同步块的动作。相比较第一个例程,整个程序的运行时间节省了1/3。细心的读者不难总结出优化前后的执行时间比例公式:(n+1)/2n,其中n为线程数。如果线程数趋近于正无穷,则程序执行效率的提高会接近50%。而如果一个线程的执行阶段被分割成m个 synchronized块,并且每个同步块使用不同的对象锁,而同步块的执行时间恒定,则执行时间比例公式可以写作:((m- 1)n+1)/mn那么当m趋于无穷大时,线程数n趋近于无穷大,则程序执行效率的提升几乎可以达到100%。(显然,我们不能按照理想情况下的数学推导来给BOSS发报告,不过通过这样的数学推导,至少我们看到了提高多线程程序并发性的一种方案,而这种方案至少具备数学上的可行性理论支持。)
可见,使用不同的对象锁,在不同的同步块中完成任务,可以使性能大大提升。
很多人看到这不禁要问:这和新的Lock框架有什么关系?
别着急。我们这就来看一看。
synchronized块的确不错,但是他有一些功能性的限制:
1. 它无法中断一个正在等候获得锁的线程,也无法通过投票得到锁,如果不想等下去,也就没法得到锁。
2.synchronized 块对于锁的获得和释放是在相同的堆栈帧中进行的。多数情况下,这没问题(而且与异常处理交互得很好),但是,确实存在一些更适合使用非块结构锁定的情况。
[]
更多精彩
赞助商链接