真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

EffectiveJava——并發(fā)篇精華總結

同步訪問共享的可變數(shù)據(jù)

將可變數(shù)據(jù)限制在單個線程中
當多個線程共享可變數(shù)據(jù),每個讀或者寫的線程都必須執(zhí)行同步
如下例,去除同步鎖則會造成死循環(huán)

創(chuàng)新互聯(lián)公司從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目網(wǎng)站制作、網(wǎng)站設計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元溧陽做網(wǎng)站,已為上家服務,為溧陽各地企業(yè)和個人服務,聯(lián)系電話:13518219792

private static boolean stopRequested;
private static synchronized void requestStop() {
    stopRequested = true;
}

private static synchronized boolean stopRequested() {
    return stopRequested;
}

public static void main(String[] args) throws InterruptedException {
    Thread backgroundThread = new Thread(new Runnable() {
        @Override
        public void run() {
            int i = 0;
            while (!stopRequested()) {
                i++;
            }
        }
    });
    backgroundThread.start();
    TimeUnit.SECONDS.sleep(1);
    requestStop();
}
避免過度同步

多線程環(huán)境下,在觀察者模式中使用CopyOnWriteArrayList或CopyOnWriteArraySet(并發(fā)場景常用),可以避免死鎖,提高并發(fā)性。反之在遍歷中去修改原有的集合,則可能會導致異常。
在同步區(qū)域內,做盡可能少的事情。

executor和task優(yōu)先于線程

大負載服務器:Executors.newFixedThreadPool(),并發(fā)過高需要限制線程總數(shù)
輕量級程序:Executors.newCachedThreadPool(),自動處理多數(shù)情況。
替代Timer:Executors.newScheduledThreadPool(),更為準確,支持多線程,并且能異常恢復。

取代notify和wait

使用并發(fā)集合和同步器,例如ConcurrentMap,無需使用notify和wait。
間歇性計時優(yōu)先使用System.nanoTime,它將更精確并免受系統(tǒng)時鐘調整影響。
如果維護代碼,優(yōu)先使用notifyAll(),避免不相關線程惡意等待。

線程安全文檔化

文檔注釋如下安全類型,而非簡單用synchronized判斷線程安全,需要注明調用時需要獲得哪一把鎖

1.不可變

不變的對象絕對是線程安全的,不需要線程同步,如String、Long、BigInteger

2.無條件的線程安全

對象自身做了 足夠的內部同步,也不需要外部同步,如 Random 、ConcurrentHashMap、Concurrent集合、atomic

3.有條件的線程安全

對象的部分方法可以無條件安全使用,但是有些方法需要外部同步,需要Collections.synchronized;有條件線程安全的最常見的例子是遍歷由 Hashtable 或者 Vector 或者返回的迭代器

4.非線程安全(線程兼容)

對象本身不提供線程安全機制,但是通過外部同步,可以在并發(fā)環(huán)境使用, 如ArrayList HashMap

5.線程對立

即使外部進行了同步調用,也不能保證線程安全,這種情況非常少,如如System.setOut()、System.runFinalizersOnExit()

慎用延遲初始化

大多數(shù)情況下使用正常初始化。
根據(jù)性能差距決定是否延遲初始化(懶加載)。當實例化開銷很高并只在部分域訪問的時候,可以考慮延遲初始化,同時在多線程下,需要考慮同步。
延遲初始化建議使用雙重檢查鎖(效率比單重大概高25%),并且變量聲明volatile。

private volatile FieldType field;
public FieldType getField() {
    FieldType result = field;
    if (result == null) {
        synchronized (this) {
            result = field;
            if (result == null) {
                field = result = computeFieldValue();
            }
        }
    }
    return result;
}

另一種方式是靜態(tài)域延遲初始化,原理是靜態(tài)內部類使用的時候才會進行初始化,并且無需使用同步。

private static class FieldHolder {
    static final FieldType field = computeFieldValue();
}

public static FieldType getField() {
    return FieldHolder.field;
}
不要依賴線程調度器

依賴線程調度器將使程序缺乏可移植性和健壯性,不依賴Thread.yield或者線程優(yōu)先級。
程序原則是確??蛇\行線程平均數(shù)量不明顯多于處理器數(shù)量。

避免使用線程組

線程組(ThreadGroup)沒有提供它所提及的任何安全功能,不僅如此它提供的功能不完全而且有缺陷,請當它不存在吧。它的替代品是線程池。


本文標題:EffectiveJava——并發(fā)篇精華總結
分享URL:http://weahome.cn/article/gjdpoi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部