不變性

不可變對象一定是線程安全的

那么什么是不可變對象呢叭首?

當(dāng)滿足一下條件時(shí),對象才是不可變的焙格。

  • 對象創(chuàng)建以后其狀態(tài)就不能修改
  • 對象的所有域都是final類型
  • 對象是正確創(chuàng)建的(在對象的創(chuàng)建期間,this引用沒有逸出)

我們回到之前因數(shù)分解的例子吴旋,通過構(gòu)造一個(gè)不可變類來實(shí)現(xiàn)同步:

class OneValueCache{
    private final BigInteger lastNumber;
    private final BigInteger[] lastFactors;

    public OneValueCache(BigInteger i, BigInteger[] factors){
        lastNumber = i;
        lastFactors = Arrays.copyOf(factors, factors.length);
    }

    public BigInteger[] getFactors(BigInteger i){
        if (lastNumber == null || !lastNumber.equals(i)) {
            return null;
        } else {
            return Arrays.copyOf(lastFactors, lastFactors.length);
        }
    }
}

public class VolatileCachedFactorizer implements Servlet{
    private volatile OneValueCache cache = 
        new OneValueCache(null,null);

    public void service(ServletRequest req, ServletResponse resp){
        BigInteger i = extractFromRequest(req);
        BigInteger[] factors = cache.getFactors(i);
        if (factors == null) {
            factors = factor(i);
            cache = new OneValueCache(i, value);
        }
        encodeIntoResponse(resp, factors); 
    }
}

我們可以看到OneValueCache為一個(gè)不可變類荣瑟,并且我們在創(chuàng)建時(shí)摩泪,使用volatile關(guān)鍵字聲明,這樣保證了線程安全性和可見性见坑。

但要注意的一點(diǎn)是:
如果final類型的域所指向的是可變對象,那么在訪問這些域所指向的對象的狀態(tài)時(shí)仍然需要同步

public final class ThreeStooges {
  private final Set<String> stooges = new HashSet<String>();

  public ThreeStooges() {
    stooges.add("Moe");
    stooges.add("Larry");
    stooges.add("Curly");
  }

  public boolean isStooge(String name) {
    return stooges.contains(name);
  }

  public synchronized Set<String> getStooges(){
    return stooges;
  }
}

如上不皆,stooges變量為可變對象熊楼,因此,如果我們需要對其訪問時(shí)鲫骗,需要加上synchronized關(guān)鍵字來保證同步。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枕磁,一起剝皮案震驚了整個(gè)濱河市术吝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌排苍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凑队,死亡現(xiàn)場離奇詭異幔翰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叫惊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門做修,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抡草,“玉大人蔗坯,你說我怎么就攤上這事”霰簦” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵橘忱,是天一觀的道長卸奉。 經(jīng)常有香客問我,道長榄棵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任祈噪,我火速辦了婚禮尚辑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杠茬。我一直安慰自己,他們只是感情好宁赤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布栓票。 她就那樣靜靜地躺著,像睡著了一般佛猛。 火紅的嫁衣襯著肌膚如雪坠狡。 梳的紋絲不亂的頭發(fā)上继找,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天婴渡,我揣著相機(jī)與錄音,去河邊找鬼边臼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硼瓣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瘟栖,長吁一口氣:“原來是場噩夢啊……” “哼谅阿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起签餐,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戒良,沒想到半個(gè)月后冠摄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沃呢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年拆挥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纸兔。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡食拜,死狀恐怖鸵熟,靈堂內(nèi)的尸體忽然破棺而出负甸,到底是詐尸還是另有隱情痹届,我是刑警寧澤打月,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站柴淘,受9級特大地震影響秘通,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肺稀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夕吻。 院中可真熱鬧,春花似錦涉馅、人聲如沸黄虱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碉渡,卻和暖如春母剥,著一層夾襖步出監(jiān)牢的瞬間滞诺,已是汗流浹背环疼。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工炫隶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淋叶,地道東北人伪阶。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓处嫌,卻偏偏與公主長得像斟湃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子凝赛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一:java概述:1墓猎,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境毙沾,java的開發(fā)工...
    ZaneInTheSun閱讀 2,654評論 0 11
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法搀军,類相關(guān)的語法,內(nèi)部類的語法罩句,繼承相關(guān)的語法,異常的語法门烂,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 可見性 當(dāng)一個(gè)線程修改了對象狀態(tài)后泄私,其他線程能夠看到發(fā)生的狀態(tài)變化 如何保證? 加鎖捅暴,當(dāng)線程B執(zhí)行由鎖保護(hù)的同步代...
    Cafebaby閱讀 549評論 0 2
  • 幾年前開始看塔莎奶奶的書咧纠,并深深的被她的生活方式所吸引,今日再讀她的傳家寶漆羔,又添佩服之情…… 且羅列下...
    aqiao閱讀 618評論 1 1
  • 對騰訊火熱推出的微信小程序進(jìn)行超快的入門,快速掌握微信小程序的入門及基礎(chǔ)知識學(xué)習(xí)技巧狱掂,并帶您搞定一個(gè)網(wǎng)絡(luò)博客小程序粹断!
    小波yagamis閱讀 408評論 0 0