摘要:所以需要等來確保程序中隱蔽的錯(cuò)誤沒有提示的錯(cuò)誤比如兩個(gè)正數(shù)相加,溢出導(dǎo)致其值為負(fù)數(shù)。并發(fā)下的兩個(gè)線程同時(shí)對(duì)一個(gè)對(duì)象,每個(gè)線程個(gè)對(duì)象,最終結(jié)果可能中有萬個(gè)對(duì)象。可能對(duì)象個(gè)數(shù)少于萬可能內(nèi)部結(jié)構(gòu)發(fā)生破壞,程序無法終止,會(huì)被大量消耗。
java并行程序基礎(chǔ)
參考:
https://github.com/chengbingh...
進(jìn)程是線程的容器
線程狀態(tài)圖:
2.2 線程的基本操作
2.2.1新建線程
2.2.2終止線程
stop 暴力終止線程,廢棄方法
2.2.3線程中斷
方法:
2.2.4 等待(wait)和喚醒notify
注意:
wait 是object的一個(gè)方法,調(diào)用wait方法的對(duì)象,必須在synchronized 中,因?yàn)橐@取它的監(jiān)視器。
wait會(huì)釋放鎖
public class SimpleWN { final static Object obj = new Object(); public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { @Override public void run() { synchronized(obj) { System.out.println("t1.start,and t1 will wait"); try { // 調(diào)用wait 方法的這個(gè)對(duì)象必須被synchronizeed //wait 會(huì)釋放鎖 obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("t1 was notify"); } } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { synchronized(obj){ System.out.println("t2 start and will notify t1"); // 調(diào)用notify 方法的這個(gè)對(duì)象必須被synchronizeed //如果 有n個(gè)線程此時(shí)都是由于調(diào)用了obj.wait方法,那么會(huì)喚醒任意一個(gè) obj.notify(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("t2 end run"); } } }); t1.start(); t2.start(); } }
輸出:注意鎖 t1.start,and t1 will wait t2 start and will notify t1 t2 end run t1 was notify
2.2.5 掛起(suspend)和繼續(xù)執(zhí)行(resume)
suspend()和resume方法
2.2.6 join 和yeild
join:加入,把線程當(dāng)做一個(gè)方法了。
yeild:讓出線程執(zhí)行權(quán),但是還是會(huì)爭奪線程的執(zhí)行權(quán)
JMM: 原子性,可見性,有序性
原子性:32位虛擬機(jī)中多線程讀寫long不會(huì)有問題,但是不能保證i++
可見性:
虛擬機(jī)在-server模式下會(huì)進(jìn)行優(yōu)化,下面的程序永遠(yuǎn)不會(huì)跳出。
/** * @author ChengBing Han * @date 9:39 2018/6/22 * @description */ public class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends Thread { public void run() { /* while (!ready){ System.out.println(new Date()); }*/ //這個(gè)和上述的優(yōu)化不同,這個(gè)在-server模式下會(huì)優(yōu)化 while (!ready) ; System.out.println(number); } } public static void main(String[] args) throws InterruptedException { //永遠(yuǎn)不會(huì)終止程序 new ReaderThread().start(); Thread.sleep(1000); number = 42; ready = true; Thread.sleep(2000); } }
備注:上述ready 用volatile 修飾后就會(huì)退出,或者用-client 模式啟動(dòng)虛擬機(jī)
2.4 分門別類的管理 線程組 2.5 駐守線程的后臺(tái):守護(hù)線程 2.6 線程優(yōu)先級(jí):先干重要的事1-10,優(yōu)先級(jí)逐漸升高
2.7 synchronized(內(nèi)部鎖)
volatile 可以保證原子性,和可見性,但是如果兩個(gè)線程同時(shí)修改了某個(gè)變量,那么還是無法識(shí)別的,這時(shí)volatile的局限性。所以需要synchronized等來確保
2.8.1 沒有提示的錯(cuò)誤e
比如兩個(gè)正數(shù)int 相加, 溢出導(dǎo)致 其值為負(fù)數(shù)。
2.8.2 并發(fā)下的ArrayList
兩個(gè)線程同時(shí)對(duì)一個(gè)ArrayList add 對(duì)象,每個(gè)線程add 10000 個(gè)對(duì)象, 最終結(jié)果
可能1:ArrayList 中有2萬個(gè)對(duì)象。
可能2:拋出異常
ArrayList 內(nèi)部結(jié)構(gòu)被破壞了
可能3:ArrayList 中的對(duì)象個(gè)數(shù)小于2萬
2.8.3 并發(fā)下的HashMap
兩個(gè)線程同時(shí)對(duì)HashMap添加對(duì)象,每個(gè)線程add 10000 個(gè)對(duì)象,最終結(jié)果
可能1:HashMap 中有2萬個(gè)對(duì)象。
可能2:對(duì)象個(gè)數(shù)少于2萬
可能3:HashMap內(nèi)部結(jié)構(gòu)發(fā)生破壞,程序無法終止,cpu會(huì)被大量消耗。
2.8.4 錯(cuò)誤加鎖
static Integer i = 0; ......... synchronized(i){ i++; } //問題在于, integer是不可變的,所以每次i++都會(huì)創(chuàng)建一個(gè)新的對(duì)象。可以用javap 反編譯查看
允許多個(gè)線程同時(shí)訪問:信號(hào)量
允許幾個(gè)線程訪問
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/71270.html
摘要:參考何去何從的并行計(jì)算忘記該死的并行并行程序的復(fù)雜性和亂序性,并行程序設(shè)計(jì)十分復(fù)雜。可怕的現(xiàn)實(shí)摩爾定律的失效單核上的晶體管數(shù)目達(dá)到極限。并發(fā)級(jí)別阻塞重入鎖無饑餓兩個(gè)線程優(yōu)先級(jí)不同,低優(yōu)先級(jí)的可能產(chǎn)生饑餓。 Chapter1 參考:https://github.com/chengbingh... 1.1何去何從的并行計(jì)算 1.1.1 忘記該死的并行并行程序的復(fù)雜性和亂序性,并行程序設(shè)計(jì)十...
摘要:通過指令重排可以減少流水線停頓提升巨大效率原則程序順序原則一個(gè)線程內(nèi)保證語義的串行性。鎖規(guī)則解鎖必然發(fā)生在隨后的加鎖前。線程的方法先于它的每一個(gè)動(dòng)作。 1. 基本概念 同步(Synchronous)和異步(Asynchronous) 并發(fā)(Conncurrency)和并行(Parallelism) 臨界區(qū) 阻塞(Blocking)與非阻塞(Non-Blocking) 死鎖(Deadl...
摘要:因此將變量存放于獨(dú)立的緩存行中,也有助于變量在多線程訪問是的性能提升實(shí)戰(zhàn)高并發(fā)程序設(shè)計(jì),大量的高并發(fā)庫都會(huì)采用這種技術(shù)。 在Java程序中,多線程幾乎已經(jīng)無處不在。與單線程相比,多線程程序的設(shè)計(jì)和實(shí)現(xiàn)略微困難,但通過多線程,我們卻可以獲得多核CPU帶來的性能飛躍,從這個(gè)角度說,多線程是一種值得嘗試的技術(shù)。那么如何寫出高效的多線程程序呢? 有關(guān)多線程的誤區(qū):線程越多,性能越好 不少初學(xué)者...
摘要:后端好書閱讀與推薦系列文章后端好書閱讀與推薦后端好書閱讀與推薦續(xù)后端好書閱讀與推薦續(xù)二后端好書閱讀與推薦續(xù)三這里依然記錄一下每本書的亮點(diǎn)與自己讀書心得和體會(huì),分享并求拍磚。然后又請(qǐng)求封鎖,當(dāng)釋放了上的封鎖之后,系統(tǒng)又批準(zhǔn)了的請(qǐng)求一直等待。 后端好書閱讀與推薦系列文章:后端好書閱讀與推薦后端好書閱讀與推薦(續(xù))后端好書閱讀與推薦(續(xù)二)后端好書閱讀與推薦(續(xù)三) 這里依然記錄一下每本書的...
摘要:后端好書閱讀與推薦系列文章后端好書閱讀與推薦后端好書閱讀與推薦續(xù)后端好書閱讀與推薦續(xù)二后端好書閱讀與推薦續(xù)三這里依然記錄一下每本書的亮點(diǎn)與自己讀書心得和體會(huì),分享并求拍磚。然后又請(qǐng)求封鎖,當(dāng)釋放了上的封鎖之后,系統(tǒng)又批準(zhǔn)了的請(qǐng)求一直等待。 后端好書閱讀與推薦系列文章:后端好書閱讀與推薦后端好書閱讀與推薦(續(xù))后端好書閱讀與推薦(續(xù)二)后端好書閱讀與推薦(續(xù)三) 這里依然記錄一下每本書的...
閱讀 2321·2021-10-11 10:59
閱讀 2606·2021-10-11 10:58
閱讀 3311·2021-09-08 09:35
閱讀 3806·2021-09-02 15:21
閱讀 1464·2019-08-30 15:53
閱讀 2616·2019-08-29 14:16
閱讀 2077·2019-08-26 14:00
閱讀 2959·2019-08-26 13:52