行云无鸣

2011-12-30

高并发下,Double.toString(double)方法存在并发瓶颈

Filed under: 乱语 — 标签:, , , — hellyguo @ 19:51

某项目中使用了大量高精度计算,采用的BigDecimal对象是通过BigDecimal.valueOf(double)或new BigDecimal(Double.toString(double))来生成的。
在高并发下,Double.toString(double)存在互斥锁,将block其他线程。
而由于项目中每个线程几乎都是在计算,导致线程互斥几率大幅放大。

如图1,这是获得锁的线程,“Owns Monitor Lock on sun/misc/FloatingDecimal@0000000116824D10/0000000116824D28”
owns lock thread
如图2,这是等待锁的线程之一,“Waiting for Monitor Lock on sun/misc/FloatingDecimal@0000000116824D10/0000000116824D28”
blocked thread
锁等待的时间倒是都不会太长,在8ms左右。但在高并发情况下,CPU会急剧飙升,且处理时间也会因此而拉长。
blacked time

解决方法:
BigDecimal对象改用new BigDecimal(String)方法来生成,可回避此问题

发表评论 »

还没有评论。

RSS feed for comments on this post. TrackBack URI

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 注销 /  更改 )

Google photo

您正在使用您的 Google 账号评论。 注销 /  更改 )

Twitter picture

您正在使用您的 Twitter 账号评论。 注销 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 注销 /  更改 )

Connecting to %s

%d 博主赞过: