十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
java中的并發(fā)和并行是什么?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的宜興網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
并發(fā)與并行
并發(fā):是指在某個(gè)時(shí)間段內(nèi),多任務(wù)交替的執(zhí)行任務(wù)。當(dāng)有多個(gè)線程在操作時(shí),把CPU運(yùn)行時(shí)間劃分成若干個(gè)時(shí)間段,再將時(shí)間段分配給各個(gè)線程執(zhí)行。 在一個(gè)時(shí)間段的線程代碼運(yùn)行時(shí),其它線程處于掛起狀。
并行:是指同一時(shí)刻同時(shí)處理多任務(wù)的能力。當(dāng)有多個(gè)線程在操作時(shí),cpu同時(shí)處理這些線程請(qǐng)求的能力。
所以在并發(fā)環(huán)境下,程序的封閉性被打破,出現(xiàn)以下特點(diǎn):
1、并發(fā)程序之間有相互制約的關(guān)系。直接制約體現(xiàn)為一個(gè)程序需要另一個(gè)程序的計(jì)算結(jié)果;間接體現(xiàn)為多個(gè)程序競(jìng)爭(zhēng)共享資源,如處理器、緩沖區(qū)等。
2、并發(fā)程序的執(zhí)行過(guò)程是斷斷續(xù)續(xù)的。程序需要記憶現(xiàn)場(chǎng)指令及執(zhí)行點(diǎn)。
3、當(dāng)并發(fā)數(shù)設(shè)置合理并且CPU擁有足夠的處理能力時(shí),并發(fā)會(huì)提高程序的運(yùn)行效率。
在并發(fā)環(huán)境中,當(dāng)一個(gè)對(duì)象可以被多個(gè)線程訪問(wèn)到時(shí),會(huì)造成該對(duì)象可以被任何訪問(wèn)到的線程進(jìn)行修改,從而出現(xiàn)數(shù)據(jù)不一致的情況。所以提出線程安全的概念。
線程基本概念介紹
線程與進(jìn)程
進(jìn)程:每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(進(jìn)程上下文),進(jìn)程間的切換會(huì)有較大的開(kāi)銷(xiāo),一個(gè)進(jìn)程包含1--n個(gè)線程。(進(jìn)程是資源分配的最小單位) 。簡(jiǎn)單講進(jìn)程就是在某種程度上相互隔離的、獨(dú)立運(yùn)行的程序。
線程:同一類(lèi)線程共享代碼和數(shù)據(jù)空間,每個(gè)線程有獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線程切換開(kāi)銷(xiāo)小。(線程是cpu調(diào)度的最小單位)
線程和進(jìn)程一樣分為五個(gè)階段:創(chuàng)建、就緒、運(yùn)行、阻塞、終止。
1、創(chuàng)建: 新創(chuàng)建了一個(gè)線程對(duì)象,還未調(diào)用start()方法。 如 Thread thread = new Thread();
2、就緒: 線程對(duì)象創(chuàng)建后,其他線程(比如main線程)調(diào)用了該對(duì)象的start()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,等待被線程調(diào)度選中 獲取cpu 的使用權(quán) 。
3、運(yùn)行: 運(yùn)行狀態(tài)(runnable)的線程獲得了cpu 時(shí)間片(timeslice) ,執(zhí)行程序代碼。
4、阻塞(Blocked):線程被阻塞了,“阻塞狀態(tài)”與“等待狀態(tài)”的區(qū)別是:“阻塞狀態(tài)”在等待著獲取到一個(gè)排它鎖,這個(gè)事件將在另外一個(gè)線程放棄這個(gè)鎖的時(shí)候發(fā)生;而“等待狀態(tài)”則是在等待一段時(shí)間,或者喚醒動(dòng)作的發(fā)生。在程序等待進(jìn)入同步區(qū)域(synchronized)的時(shí)候,線程將進(jìn)入這種狀態(tài)。
(一). 等待阻塞: 運(yùn)行(running) 的線程執(zhí)行o.wait()方法,JVM會(huì)把該線程放入等待隊(duì)列(waitting queue)中。
(二). 同步阻塞: 運(yùn)行(running) 的線程在獲取對(duì)象的同步鎖時(shí),若該同步鎖被別的線程占用,則JVM會(huì)把該線程放入鎖池(lock pool)中。
(三). 其他阻塞: 運(yùn)行(running) 的線程執(zhí)行Thread.sleep(long ms)或t.join()方法,或者發(fā)出了I/O請(qǐng)求時(shí),JVM會(huì)把該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時(shí)、join()等待線程終止或者超時(shí)、或者I/O處理完畢時(shí),線程重新轉(zhuǎn)入 可運(yùn)行(runnable) 狀態(tài)。
5、等待: 進(jìn)入該狀態(tài)的線程需要等待其他線程做出一些特定動(dòng)作(通知或中斷)。
6、阻塞:當(dāng)一個(gè)線程試圖獲取一個(gè)內(nèi)部的對(duì)象鎖(非java.util.concurrent庫(kù)中的鎖),而該鎖被其他線程持有,則該線程進(jìn)入阻塞狀態(tài)。
7、等待:當(dāng)一個(gè)線程等待另一個(gè)線程通知調(diào)度器一個(gè)條件時(shí),該線程進(jìn)入等待狀態(tài)。例如調(diào)用:Object.wait()、Thread.join()以及等待Lock或Condition。
8、超時(shí)等待(TIMED_WAITING):該狀態(tài)不同于WAITING,它可以在指定的時(shí)間后自行返回。
9、終止(TERMINATED):表示該線程已經(jīng)執(zhí)行完畢。
關(guān)于java中的并發(fā)和并行是什么問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。