6率挣、Java并發(fā)編程入門與高并發(fā)面試-線程安全策略

慕課網(wǎng) Jimin老師 Java并發(fā)編程入門與高并發(fā)面試 學(xué)習(xí)筆記
Java并發(fā)編程入門與高并發(fā)面試

不可變對(duì)象需要滿足的條件

◆對(duì)象創(chuàng)建以后其狀態(tài)就不能修改
◆對(duì)象所有域都是final類型
◆對(duì)象是正確創(chuàng)建的(在對(duì)象創(chuàng)建期間, this引用沒(méi)有逸出)
方式(可參考String類):
  • 將類申明為final
  • 將所有的成員申明為私有
  • 對(duì)變量不提供set方法枢里,將所有可變成員聲明為final账锹,這樣只能對(duì)其賦值一次
  • 通過(guò)構(gòu)造器初始化所有成員雁比,進(jìn)行深度拷貝
  • 在get方法中,不返回對(duì)象的本身侧蘸,而是返回其對(duì)象的拷貝

final關(guān)鍵字:類裁眯、 方法、變量

◆修飾類:不能被繼承
◆修飾方法: 1闺魏、鎖定方法不被繼承類修改; 2、效率
◆修飾變量:基本數(shù)據(jù)類型變量俯画、引用類型變量
package com.huhao.concurrency.example.immutable;

import com.google.common.collect.Maps;
import com.huhao.concurrency.annoations.NotThreadSafe;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

@Slf4j
@NotThreadSafe
public class ImmutableExample1 {
    private final static Integer a = 1;
    private final static String b = "2";
    private final static Map<Integer, Integer> map = Maps.newHashMap();

    static {
        map.put(1, 2);
        map.put(3, 4);
        map.put(5, 6);
    }

    public static void main(String[] args) {
//        a = 2;
//        b = "3";
//        map = Maps.newHashMap();不允許聲明成新的變量析桥,
        //但是可以修改,新增內(nèi)部的值
        map.put(1, 3);
        log.info("{}", map.get(1));
        log.info("{}", map);
    }

    private void test(final int a) {
        //不可以改
        //a = 1;
    }

}
除了final可設(shè)置不可變變量,還可以通過(guò)以下類

◆Collections.unmodifiableXXX : Collection. List. Set. Map...
◆Guava : ImmutableXXX : Collection艰垂、List, Set泡仗、 Map...

package com.huhao.concurrency.example.immutable;

import com.google.common.collect.Maps;
import com.huhao.concurrency.annoations.NotThreadSafe;
import com.huhao.concurrency.annoations.ThreadSafe;
import lombok.extern.slf4j.Slf4j;

import java.util.Collections;
import java.util.Map;

/**
 * unmodifiableMap
 * 不可修改
 * 修改時(shí)不會(huì)編譯報(bào)錯(cuò),但是運(yùn)行會(huì)報(bào)錯(cuò)拋出異常
 */
@Slf4j
@ThreadSafe
public class ImmutableUnmodifiableMap {
    private static Map<Integer, Integer> map = Maps.newHashMap();

    static {
        map.put(1, 2);
        map.put(3, 4);
        map.put(5, 6);
        //不可被修改
        map = Collections.unmodifiableMap(map);
    }

    public static void main(String[] args) {
        //unmodifiableMap后猜憎,修改會(huì)報(bào)錯(cuò)
        map.put(1, 3);
        log.info("{}", map.get(1));
        log.info("{}", map);
    }
}
package com.huhao.concurrency.example.immutable;


import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.huhao.concurrency.annoations.ThreadSafe;
import lombok.extern.slf4j.Slf4j;

/**
 * ImmutableImmutable
 */
@Slf4j
@ThreadSafe
public class ImmutableImmutable {
    private final static ImmutableList<Integer> list = ImmutableList.of(1, 2, 3);
    private final static ImmutableSet set = ImmutableSet.copyOf(list);

    private final static ImmutableMap<Integer, Integer>
            map = ImmutableMap.of(1, 2, 3, 4);

    private final static ImmutableMap<Integer, Integer>
            map2 = ImmutableMap.<Integer, Integer>builder()
            .put(1, 2).put(3, 4).put(5, 6)
            .build();

    public static void main(String[] args) {
        //會(huì)拋出異常
        //list.add(4);

        //會(huì)拋出異常
//        map.put(1, 4);
//        map2.put(1, 4);
    }
}

線程封閉

1娩怎、Ad-hoc線程封閉:程序控制實(shí)現(xiàn),最糟糕,忽略
2胰柑、堆棧封閉:局部變量截亦,無(wú)并發(fā)問(wèn)題,能用局部變量就不用全局變量
3柬讨、ThreadLocal 線程封閉:特別好的封閉方法
eg:動(dòng)態(tài)數(shù)據(jù)源切換時(shí)候崩瓤, 每個(gè)線程請(qǐng)求取到的context_holder都是獨(dú)立的

image.png

線程不安全類與寫法
StringBuilder ->StringBuffer
builder是不安全的,buffer是安全的踩官。不過(guò)在方法里的私有的却桶,用builder效率更高
SimpleDateFormat -> JodaTime
SimpleDateFormat 不安全、每次都是要new SimpleDateFormat (),不然會(huì)報(bào)錯(cuò)颖系。JodaTime是線程安全    的嗅剖,推薦使用,而且還有其他優(yōu)勢(shì)嘁扼。
ArrayList信粮,HashSet,HashMap等Collections
同步容器
◆ArrayList -> Vector, Stack
◆HashMap -> HashTable (key偷拔、value不能為null)
◆Collections.synchronizedXXX (List蒋院、Set、 Map)
并發(fā)容器J.U.C
◆ArrayList -> CopyOnWriteArrayList
HashSet莲绰、TreeSet -> CopyOnWriteArraySet
ConcurrentSkipListSet
◆HashMap欺旧、 TreeMap -> ConcurrentHashMap
ConcurrentSkipListMap
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蛤签,隨后出現(xiàn)的幾起案子辞友,更是在濱河造成了極大的恐慌,老刑警劉巖震肮,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件称龙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡戳晌,警方通過(guò)查閱死者的電腦和手機(jī)鲫尊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)沦偎,“玉大人疫向,你說(shuō)我怎么就攤上這事『篮浚” “怎么了搔驼?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)侈询。 經(jīng)常有香客問(wèn)我舌涨,道長(zhǎng),這世上最難降的妖魔是什么扔字? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任囊嘉,我火速辦了婚禮,結(jié)果婚禮上革为,老公的妹妹穿的比我還像新娘哗伯。我一直安慰自己,他們只是感情好篷角,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布焊刹。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虐块。 梳的紋絲不亂的頭發(fā)上俩滥,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音贺奠,去河邊找鬼霜旧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛儡率,可吹牛的內(nèi)容都是我干的挂据。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼儿普,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼崎逃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起眉孩,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤个绍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后浪汪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巴柿,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年死遭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了广恢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呀潭,死狀恐怖钉迷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜗侈,我是刑警寧澤篷牌,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布睡蟋,位于F島的核電站踏幻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏戳杀。R本人自食惡果不足惜该面,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望信卡。 院中可真熱鬧隔缀,春花似錦、人聲如沸傍菇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至牵触,卻和暖如春淮悼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背揽思。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工袜腥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钉汗。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓羹令,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親损痰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子福侈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355