Java并發(fā)簡(jiǎn)介


一,Java并發(fā)簡(jiǎn)史

  • 資源利用率

在某些情況下,程序必須等待某個(gè)外部操作執(zhí)行完成,例如輸入操作或輸出操作等,而在等待時(shí)程序無法執(zhí)行其它任何工作.因此,如果在等待的同時(shí)可以運(yùn)行另一個(gè)程序,那么無疑提高了資源的利用率.

專注于為中小企業(yè)提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)平川免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

  • 公平性

不同的用戶和程序?qū)τ?jì)算機(jī)資源有著同等的使用權(quán).一種高效的運(yùn)行方式是通過粗粒度的時(shí)間片使這些用戶和程序能共享計(jì)算機(jī)資源,而不是一個(gè)程序從頭運(yùn)行到尾,然后在啟動(dòng)下一個(gè)程序.

  • 便利性

通常來說,在計(jì)算機(jī)多任務(wù)時(shí),應(yīng)該編寫多個(gè)程序,每個(gè)程序執(zhí)行一個(gè)任務(wù)并在必要時(shí)相互通信,這比只編寫一個(gè)程序來計(jì)算所有的任務(wù)更容易實(shí)現(xiàn).

二,Java并發(fā)的優(yōu)勢(shì)

  • 發(fā)揮多核處理器的強(qiáng)大處理能力
  • 建模的簡(jiǎn)單性
  • 異步事件的簡(jiǎn)單化處理
  • 響應(yīng)更靈敏的用戶界面

三,Java并發(fā)的風(fēng)險(xiǎn)

  • 安全性問題

線程安全性可能是非常復(fù)雜的,在沒有充足的同步情況下,多線程中的執(zhí)行操作順序是不可測(cè)試,會(huì)產(chǎn)生奇怪的問題.

如下代碼實(shí)例 : UnsafeSequence.java ,1000個(gè)線程,并發(fā)10次,value++

public class UnsafeSequence {

    /** 默認(rèn)值0 */
    private static int value = 0;

    /** 線程執(zhí)行數(shù)量 */
    private static int  threadCount = 1000;

    /** 并發(fā)數(shù)量 */
    private static int concurrentCount = 10;

    /** 線程池 */
    private static ExecutorService executor = Executors.newFixedThreadPool(threadCount);

    /** 信號(hào)量(并發(fā)數(shù)) */
    private static Semaphore semaphore = new Semaphore(concurrentCount);

    /** 和join方法類似 */
    private static CountDownLatch countDownLatch = new CountDownLatch(threadCount);

    public static int getNext () {
        return  value++;
    }

    public static  void main (String[] args) {
        // 啟動(dòng)100 個(gè)線程 并發(fā)10次 去累加 value
        for (int i = 0; i < threadCount; i++) {
            executor.execute(() -> {
                try {
                    // 獲取一個(gè)許可證
                    semaphore.acquire();
                    getNext();
                    // 計(jì)數(shù)器減1
                    countDownLatch.countDown();
                    // 歸還一個(gè)許可證
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        // 關(guān)閉線程池
        executor.shutdown();
        try {
            // 阻塞主線程 直到計(jì)數(shù)器為0
            countDownLatch.await();
            System.out.println(value);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
結(jié)果可能是1000或者小于1000,問題在于,如果執(zhí)行的時(shí)機(jī)不對(duì),那么兩個(gè)線程在調(diào)用getNext時(shí)會(huì)得到相同的值,雖然遞增運(yùn)算看起來是單個(gè)操作,但是實(shí)際上是三個(gè)獨(dú)立的操作,讀取value,將value加1,將計(jì)算結(jié)果寫入value,由于多線程交替運(yùn)行,因此兩個(gè)線程同時(shí)執(zhí)行讀操作,讀到了相同的值,結(jié)果寫入主內(nèi)存,結(jié)果就是不同的線程寫入了相同的值.
  • 活躍性問題

一個(gè)并發(fā)應(yīng)用程序能及時(shí)執(zhí)行的能力稱為活躍性,常見的有死鎖,饑餓,活鎖問題.

  • 性能問題

性能問題包括多個(gè)方面,例如服務(wù)器時(shí)間過長(zhǎng),響應(yīng)不夠靈敏,吞吐率過低,資源消耗過高,或者伸縮性較低等.

文章題目:Java并發(fā)簡(jiǎn)介
分享鏈接:http://muchs.cn/article12/gedhdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、外貿(mào)建站、企業(yè)網(wǎng)站制作、Google、外貿(mào)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)