java lazy_Java性能优化要点之五: 队列与lazySet
Java性能優(yōu)化要點(diǎn)之五: 隊(duì)列與lazySet
隊(duì)列需要對(duì)正確的應(yīng)用使用好正確的隊(duì)列Queue,否則會(huì)產(chǎn)生性能問題,隊(duì)列分生產(chǎn)者和消費(fèi)者,或者發(fā)布者訂閱者,它們之間有一對(duì)多和多對(duì)多以及多對(duì)一等關(guān)系。
SPSC:一個(gè)Producer :一個(gè)Consumer
SPMC:一個(gè)Producer :多個(gè)Consumer
MPSC:多個(gè)Producer :多個(gè)Consumer
MPMC:多個(gè)Producer :多個(gè)Consumer
記住:在JDK中所有并發(fā)的隊(duì)列Queue都是MPMC。JAQ-InABox是一個(gè)提高了性能的Queue實(shí)現(xiàn)。
Atomic*.lazySet(…)
根據(jù)單寫原理,JDK的AtomicLong.lazySet等方法是便宜的最好性能,成本低便宜的volatile 寫總是受大家歡迎,前提是只有一個(gè)寫入者,也就是一個(gè)Producer。
以AtomicReference的lazySet為例子,其代碼如下:
public final void lazySet(V newValue) {
unsafe.putOrderedObject(this, valueOffset, newValue);
}
lazySet是使用Unsafe.putOrderedObject方法,這個(gè)方法在對(duì)低延遲代碼是很有用的,它能夠?qū)崿F(xiàn)非堵塞的寫入,這些寫入不會(huì)被Java的JIT重新排序指令(instruction reordering),這樣它使用快速的存儲(chǔ)-存儲(chǔ)(store-store) barrier, 而不是較慢的存儲(chǔ)-加載(store-load) barrier, 后者總是用在volatile的寫操作上,這種性能提升是有代價(jià)的,雖然便宜,也就是寫后結(jié)果并不會(huì)被其他線程看到,甚至是自己的線程,通常是幾納秒后被其他線程看到,這個(gè)時(shí)間比較短,所以代價(jià)可以忍受。
類似Unsafe.putOrderedObject還有unsafe.putOrderedLong等方法,unsafe.putOrderedLong比使用 volatile long要快3倍左右。.
在DDD中有值對(duì)象概念,值對(duì)象的特點(diǎn)是不可變的,而我們經(jīng)常要修改的狀態(tài)是可變的,結(jié)合lazySet和值對(duì)象我們可以編寫并發(fā)性很好的可變狀態(tài)修改。
比如:Forum論壇有一個(gè)論壇狀態(tài)ForumState,論壇狀態(tài)主要是當(dāng)前最新的帖子等信息,每次有新貼發(fā)布時(shí),會(huì)更新論壇狀態(tài),我們將ForumState設(shè)計(jì)成一個(gè)值對(duì)象,一旦有新的帖子發(fā)布,就創(chuàng)建一個(gè)新的對(duì)象 ForumState,然后替換掉舊的狀態(tài),這種替換動(dòng)作可以使用AtomicLong.lazySet來完成。
public class Forum extends ForumModel {
private volatile AtomicReference forumState;
public ForumState getForumState() {
try {
return forumState.get();
} finally {
}
}
public void setForumState(ForumState forumState) {
this.forumState.lazySet(forumState);
}
..
}
總結(jié)
以上是生活随笔為你收集整理的java lazy_Java性能优化要点之五: 队列与lazySet的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: java ipv6校验_JS及java验
 - 下一篇: java 内存屏障类型_Java内存模型