Java 6,7,8中的String.intern ―― 多线程访问 - ImportNew
本文是Java 6,7,8中的String.intern ―― 字符串池的后续,"字符串池"这篇文章介绍了Java 7和8中String.intern()方法的实现以及使用它的优势,鉴于其篇幅已经很长,所以我写了本文来介绍多线程访问String.intern时的性能特征。
测试程序将从多个线程调用String.intern()。它们将模拟大多数现代服务器应用的行为(比如特定的网络爬虫)。为测试高竞争的场景,这些程序将在新工作站运行,配置是Intel Xeon E5-2650 CPU (8物理16虚拟内核@ 2 Ghz),128 Gb RAM。为利用所有的物理内核我们将创建8个线程。
四个测试程序如下:
- 参照程序――前一篇文章中的
testLongLoop方法单线程调用String.intern(),用来展示没有任何竞争时运行速度。 - 8个线程调用不同字符串的
String.intern()方法,该interned字符串用每个线程的线程号作为前缀。该测试展示了String.intern()的同步开销。理论上这是最坏的情况:一个实际应用所做的唯一事情就是多个线程都循环调用String.intern(),这样的情况几乎不可能出现。 - 开始时启动第一个线程interning字符串集合。2秒延迟后启动第二个线程interning相同的字符串集合。我们希望对于第一个线程以下的假设为true:
str.intern()==str;第二个线程str.intern()!=str为true。这将证明不存在线程本地的JVM字符串池。 - 所有8个线程intern相同字符串集合。这种情况更加接近真实的情形――对于JVM字符串池添加和查询字符串的混合操作。但是,如此高的JVM字符串池读竞争也很少发生。
Read full article from Java 6,7,8中的String.intern ―― 多线程访问 - ImportNew
No comments:
Post a Comment