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

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

五分鐘看穿Java并發(fā)相關(guān)概念,并發(fā)原來如此簡單

本文主要對(duì)Java并發(fā)(Concurrent)相關(guān)的概念進(jìn)行說明。

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的資興網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

1.進(jìn)程(Process)與線程(Thread)

  1. 進(jìn)程是系統(tǒng)資源分配的最小單元。線程是CPU調(diào)度的最小單元。
  2. 一個(gè) 進(jìn)程至少包含一個(gè)線程,可以包含多個(gè)線程。這些線程共享這個(gè)進(jìn)程的資源。
  3. 每個(gè)線程都擁有獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器,線程切換開銷小。
  4. 多進(jìn)程指的是操作系統(tǒng)同時(shí)運(yùn)行多個(gè)程序,如當(dāng)前操作系統(tǒng)中同時(shí)運(yùn)行著QQ、IE、微信等程序。
  5. 多線程指的是同一進(jìn)程中同時(shí)運(yùn)行多個(gè)線程,如迅雷運(yùn)行時(shí),可以開啟多個(gè)線程,同時(shí)進(jìn)行多個(gè)文件的下載。

    2.并行(Parallel)、并發(fā)(Concurrent)與多線程(Multithreading)

  6. 并行是指多個(gè)任務(wù)在同一時(shí)刻進(jìn)行。并發(fā)是指多個(gè)任務(wù)在同一時(shí)間段內(nèi)發(fā)生。
  7. 并行是物理上的同時(shí)發(fā)生,而并發(fā)是邏輯上的同時(shí)發(fā)生。
  8. 體現(xiàn)在程序上: 并行是指多個(gè)CPU內(nèi)核在同一時(shí)刻,同時(shí)運(yùn)行多個(gè)任務(wù)。并發(fā)是指單個(gè)CPU內(nèi),通過CPU調(diào)度算法,讓用戶感覺在同時(shí)運(yùn)行多個(gè)任務(wù)。
  9. 更形象的說法: 并行是指兩隊(duì)人員同時(shí)使用兩臺(tái)咖啡機(jī)。并發(fā)是指兩隊(duì)人員交替使用同一臺(tái)咖啡機(jī)?!?Erlang 之父 Joe Armstrong。

五分鐘看穿Java并發(fā)相關(guān)概念,并發(fā)原來如此簡單

  1. 多線程即多個(gè)線程,一般只多個(gè)同時(shí)在運(yùn)行的單線程。
  2. 如果是在單核CPU上,多線程肯定是并發(fā)運(yùn)行的。如果是在多核CPU上,這些多線程也可能是并行運(yùn)行。

    3.線程安全

    線程安全,指的是在并發(fā)的情況之下,線程的調(diào)度順序不影響運(yùn)行結(jié)果。

如不加鎖控制的轉(zhuǎn)賬操作,在單線程運(yùn)行中是安全的,但是在多線程環(huán)境中,肯定是不安全的。
這里只給出示例,具體邏輯就沒不解釋了。

void transferMoney(User from, User to, float amount){
    to.setMoney(to.getBalance() + amount);
    from.setMoney(from.getBalance() - amount);
}

4.死鎖

死鎖是指兩個(gè)或更多線程阻塞著等待其它處于死鎖狀態(tài)的線程所持有的鎖。

例如,

  • 如果線程1鎖住了A,然后嘗試對(duì)B進(jìn)行加鎖,同時(shí)線程2已經(jīng)鎖住了B,接著嘗試對(duì)A進(jìn)行加鎖,這時(shí)死鎖就發(fā)生了。
  • 線程1永遠(yuǎn)得不到B,線程2也永遠(yuǎn)得不到A,并且它們永遠(yuǎn)也不會(huì)知道發(fā)生了這樣的事情。
  • 為了得到彼此的對(duì)象(A和B),它們將永遠(yuǎn)阻塞下去。這種情況就是一個(gè)死鎖。

    5.并發(fā)優(yōu)點(diǎn)

    5.1.資源利用率高

    假定場景:需要從本地讀取和處理兩個(gè)文件,讀取一個(gè)文件需要5秒,處理一個(gè)文件需要2秒。
    單線程:
    ```
    5秒讀取文件A
    2秒處理文件A
    5秒讀取文件B
    2秒處理文件B

總共需要14秒


多線程:

5秒讀取文件A
5秒讀取文件B + 2秒處理文件A

2秒處理文件B

總共需要12秒
```

總結(jié):

  • 在等待磁盤讀取文件的時(shí)候,CPU大部分時(shí)間是空閑的。
  • 利用多線程編程,可以在磁盤讀取文件的CPU空閑時(shí)間內(nèi)做一些其他的事情。
  • 所以說, 使用多線程資源利用率更高。

5.2.程序響應(yīng)更快

一個(gè)桌面應(yīng)用程序存在多個(gè)按鈕。點(diǎn)擊這些按鈕,可以分別進(jìn)行一些耗時(shí)的工作。

單線程:

每次點(diǎn)擊一個(gè)按鈕,都會(huì)進(jìn)行一項(xiàng)耗時(shí)的工作。必須等待此項(xiàng)工作完成之后,才能繼續(xù)監(jiān)聽用戶操作。這時(shí),用戶才能點(diǎn)擊其他按鈕,進(jìn)行其他的工作。這樣的應(yīng)用程序,對(duì)用戶而言,響應(yīng)十分慢,體驗(yàn)度很差。

多線程:

每次點(diǎn)擊一個(gè)按鈕,都會(huì)啟動(dòng)一個(gè)子線程去進(jìn)行這項(xiàng)耗時(shí)的工作,主線程繼續(xù)監(jiān)聽用戶操作。這種情況下,用戶可以快速的分別點(diǎn)擊需要處理的按鈕。這樣的應(yīng)用程序,對(duì)用戶而言,響應(yīng)很快,體驗(yàn)度很好。

6.并發(fā)缺點(diǎn)

6.1.設(shè)計(jì)開發(fā)更復(fù)雜

線程之間的交互往往非常復(fù)雜。 不正確的線程同步產(chǎn)生的錯(cuò)誤非常難以發(fā)現(xiàn),并且難以重現(xiàn)、難以修復(fù)。

6.2.增加額外資源消耗

多線程開發(fā)會(huì)產(chǎn)生額外的資源消耗,主要來源于三個(gè)方面:

  • 線程本身需要消耗一些資源進(jìn)行本地堆棧的維持與管理。
  • 線程之間切換會(huì)導(dǎo)致的上下文切換(Context Switch)開銷。
  • 多線程的管理對(duì)CPU來說又是一筆開銷。

所以,由于多線程會(huì)增加額外的資源消耗,對(duì)多線程程序而言,線程并不是越多就會(huì)越快,過多的線程返回會(huì)導(dǎo)致程序變慢。

歡迎關(guān)注工種號(hào):《老男孩的架構(gòu)路》,后臺(tái)私信“資料”領(lǐng)取《Java面試寶典Plus》版


網(wǎng)站題目:五分鐘看穿Java并發(fā)相關(guān)概念,并發(fā)原來如此簡單
URL鏈接:http://weahome.cn/article/ieooig.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部