知识大全 Java 6中的线程优化真的有效么

Posted

篇首语:学在苦中求,艺在勤中练。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java 6中的线程优化真的有效么相关的知识,希望对你有一定的参考价值。

Java 6中的线程优化真的有效么?[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  关于结果的讨论

  之所以使用非同步的StringBuilder 是为了提供一个测量性能的基线 我也想了解一下各种优化是否真的能够影响StringBuilder的性能 正如我们所看到的 StringBuilder的性能可以保持在一个不变的吞吐量水平上 因为这些技术的目标在于锁的优化 因此这个结果符合预期 在性能测试的另一栏中我们也可以看到 使用没有任何优化的同步的StringBuffer 其运行效率比StringBuilder大概要慢三倍

  仔细观察图 的结果 我们可以注意到从左到右性能有一定的提高 这可以归功于EliminateLocks 不过 这些性能的提升比起偏向锁来说又显得有些苍白 事实上 除了C列以外 每次运行时如果开启偏向锁最终都会提供大致相同的性能提升 但是 C列是怎么回事呢?

  在处理最初的数据的过程中 我注意到有一项测试在六个测试中要花费格外长的时间 由于结果的异常相当明显 因此基准测试似乎在报告两个完全不同的优化行为 经过一番考虑 我决定同时展示出高值和低值(B列和C列) 由于没有更深入的研究 我只能猜测这里应用了一种以上的优化(很可能是两种) 并且存在一些竞争条件 偏向锁大多时候会取胜 但不非总能取胜 如果另一种优化占优了 那么偏向锁的效果要么被抑制 要么就被延迟了

  这种奇怪的现象是逸出分析导致的 明确了这个基准测试的单线程化的本质后 我期待着逸出分析会消除锁 从而将StringBuffer的性能提到了与 StringBuilder相同的水平 但是很明显 这并没有发生 还有另外一个问题 在我的机器上 每一次运行的时间片分配都不尽相同 更为复杂的是 我的几位同事在他们的机器上运行这些测试 得到的结果更混乱了 在有些时候 这些优化并没有将程序提速那么多

  前期的结论 

  尽管图 列出的结果比我所期望的要少 但确实可以从中看出各种优化能够除去锁产生的大部分开销 但是 我的同事在运行这些测试时产生了不同的结果 这似乎对测试结果的真实性提出了挑战 这个基准测试真的测量锁的开销了么?我们的结论成熟么?或者还有没有其他的情况?在本文的第二部分里 我们将会深入研究这个基准测试 力争回答这些问题 在这个过程中 我们会发现获取结果并不困难 困难的是判断出这些结果是否可以回答前面提出的问题

public class LockTest private static final int MAX = ; // million

public static void main(String[] args) throws InterruptedException // warm up the method cachefor (int i = ; i < MAX; i++)      concatBuffer( Josh James Duke );     concatBuilder( Josh James Duke );

System gc();Thread sleep( );

System out println( Starting test );long start = System currentTimeMillis();for (int i = ; i < MAX; i++)      concatBuffer( Josh James Duke );long bufferCost = System currentTimeMillis() start;System out println( StringBuffer: + bufferCost + ms );

System gc();Thread sleep( );

start = System currentTimeMillis();for (int i = ; i < MAX; i++)      concatBuilder( Josh James Duke );long builderCost = System currentTimeMillis() start;System out println( StringBuilder: + builderCost + ms );System out println( Thread safety overhead of StringBuffer: + ((bufferCost * / (builderCost * )) ) + %\\n );

public static String concatBuffer(String s String s String s ) StringBuffer sb = new StringBuffer();     sb append(s );     sb append(s );     sb append(s );     return sb toString();

public static String concatBuilder(String s String s String s )      StringBuilder sb = new StringBuilder(); sb append(s ); sb append(s ); sb append(s ); return sb toString();

cha138/Article/program/Java/gj/201311/27669

相关参考

知识大全 Java 6中的线程优化真的有效么

Java6中的线程优化真的有效么?[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  运行基准

知识大全 Java 6中的线程优化真的有效么

Java6中的线程优化真的有效么?[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  介绍—J

知识大全 Java 6中的线程优化真的有效么

Java6中的线程优化真的有效么?[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  简析锁粗

知识大全 Java 6中的性能优化

Java6中的性能优化  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  JSE(代号Mustang

知识大全 Java中的线程组

Java中的线程组  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  所有线程都隶属于一个线程组那可

知识大全 Java线程模型缺陷研究[6]

Java线程模型缺陷研究[6]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 java多线程中的异常处理

  在java多线程程序中所有线程都不允许抛出未捕获的checkedexception也就是说各个线程需要自己把自己的checkedexception处理掉这一点是通过javalangRunnable

知识大全 JAVA多线程中的锁机制

JAVA多线程中的锁机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  JAVA中的每个对象都可

知识大全 Java线程通信源代码中的奥秘探究

Java线程通信源代码中的奥秘探究  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java线程通

知识大全 Java线程池在使用中的问题解疑

Java线程池在使用中的问题解疑  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java线程池需