对一个多线程应用进行调优
下面我们将提供一个例子程序并演示如何在多核平台上获得更好的可扩展性这个例子程序演示了一个假想的日志服务器它接收来自多个源的日志信息并将其统一保存到文件系统中为了简单起见我们的例子代码中不包含任何的网络相关代码Main() 函数将启动多个线程来发送日志信息到日志服务器中对于性急的读者让我们先看看调优的结果
图 日至服务器调优结果
在上图中蓝色的曲线是一个基于 Lock 的老式日志服务器而绿色的曲线是我们进行了性能调优之后的日志服务器可以看到LogServerBad 的性能随线程数目的增加变化很小而 LogServerGood 的性能则随着线程数目的增加而线性增长如果不介意使用第三方的库的话那么来自 Project KunMing 的 LockFreeQueue 可以进一步提供更好的可扩展性
图 使用 Lockfree 的数据结构
在上图中第三条曲线表示用 LockFreeQueue 替换标准库中的 ConcurrentLinkedQueue 之后的性能曲线可以看到如果线程数目较少时两条曲线差别不大但是单线程数目增大到一定程度之后LockFree 的数据结构具有明显的优势
在下文中将介绍在上述例子中使用的可以帮助我们创建高可扩展 Java 应用的工具和技巧