day12

回顧:

我們到web階段的程序都是多線程,web下的項目都是多線程環(huán)境

會創(chuàng)建一個.class類,同時開辟多個線程,同時使用,由web服務器自動做

Thread有四個方法:

兩個成員方法:getName(),獲取線程名稱

setName()設置線程名稱

兩個靜態(tài)方法:

currentThread()獲取當前線程對象

sleep()讓當前線程暫停指定的毫秒值

多線程的運行原理:

兩個線程一起工作,兩個線程會無序運行,

常見的高并發(fā)的線程安全性問題:

變量的可見性:一個線程的訪問頻率太快,他如果訪問速度太快,會從方法區(qū)加載到自己的main棧方法單獨做一個副本,不會再去方法區(qū)找變量,會導致,方法區(qū)內的變量更改,此線程也沒變化.

代碼的有序性:代碼重排的問題,一段代碼,JVM編譯器再編譯的時候,為了提高效率,在不影響執(zhí)行結果的情況下,可能會對代碼進行重排,在多線程的環(huán)境下,就會出現問題,導致結果不一樣.

變量訪問的原子性: 多個線程共同訪問同一變量,由于訪問的代碼不具有原子性(不可再拆分的),說一導致最終結果不準確.

原子性:在java中,對基本數據類型的變量和賦值操作都是原子性操作

j=i;是兩個操作,讀取i,將i賦值給j

i++;是三個操作,讀取i值,i+1;將+1的結果賦值給i

在單線程環(huán)境中,我們可以認為整個步驟都是原子性操作,但在多線程環(huán)境下,Java

只保證了基本數據類型的變量和賦值操作才是原子性(在32位的jdk環(huán)境下,對64位數據的操作不是原子性操作,如long,double)

https://blog.csdn.net/u013412772/article/details/80109727

cas機制,樂觀鎖會先取這個值,交給cas的一個方法,告訴他我要把這個值變成另外的一個值

所以cas方法做這個事,先比較,會從內存中先把值取出來,去跟你要改的值進行比較,如果一樣,執(zhí)行修改,不一樣就自旋,再取一次,再去比較,樂觀鎖,

對數組進行操作的原子類,AtomicIntegerArray,int類型數據進行原子操作

AtomicLongArray,對Long[]數據進行原子操作

AtomicReferenceArray,對引用類型數組原子操作

在多線程環(huán)境下,這三個問題要全部解決,才是一個好的解決方案,第三方的線程框架,這些框架提出的解決方案,java類庫提出的解決方案就是原子類

web項目默認多線程環(huán)境

,需要了解的:線程安全


正式學習:

synchronized(同步)關鍵字:對一段代碼

作用:我們對一段代碼或者一個方法整體的進行多線程安全的控制,它代表同步的,可以保證單個線程在執(zhí)行這段代碼時,其他的線程不能執(zhí)行這段代碼,要排隊等待

使用方式:

同步代碼塊:

同步方法(常用)


同步代碼塊:需要同一個共享的鎖對象,需要靜態(tài)的,普通對象,不共享.

使用結構:繼承Thread類,重寫run()方法,在run方法內寫synchronized(共享的對象,需要時static修飾的){

代碼塊

}

一個線程搶到鎖了之后,釋放鎖的時候,還繼續(xù)參與搶鎖

synchronized可以鎖run放在重寫run方法的void之前,自定義MyThread對象實現Runable接口,并且在測試類中,new一個自定義對象,再使用自定義對象來作為Thread的有參方法,再使用Thread的start方法

同步方法:將一個方法整體設置為同步的,使用synchronized關鍵字

格式:

自定義類繼承Thread類,方法為public static synchronized 返回值類型 方法名(形參列表){? }

static的原因是:普通成員方法的鎖對象是:本對象

靜態(tài)方法的鎖對象是本類的Class對象,JVM會為每一個類創(chuàng)建一個class對象,加上靜態(tài)的關鍵字

測試時,需要new多個自定義類,給自定義類setname(""),再start()


實現Runnable接口的synichronized關鍵字的使用方式

Thread.currentThread().getName(),獲取當前的線程對象的線程名

自定義類實現Runnable接口,方法可以不使用static關鍵字修飾,,測試類中只需要new一個自定義類,再通過new Thread(自定義類名)的有參構造方法來創(chuàng)建多個線程


也可以synchronized修飾run方法,

synchronized被稱為悲觀鎖:無論是否有線程安全,都會加鎖,就會有額外的操作,就會降低效率

CAS機制,被稱為"樂觀鎖",比較并交換,"比較"的大部分時候都是線程安全的.針對少數發(fā)生線程安全問題時,才采用"自旋",再JDK1.5之后的JUC包(java.util.concurrent包)中的很多原子類,同步類,都是使用CAS機制實現,比較快


Lock鎖:提供了一種新的鎖:java.util.concurrent.Lock(接口),使用方法的形式進行枷鎖,釋放鎖,比synchronized更加靈活,


Lock鎖的內部tong'bu'dia'a'm





CopyOnWriteArrayList類(線程安全的)

CopyOnWriteArraySet類

ConcurrentHashMap類


多線程控制的工具類:

CountDownLatch多線程協(xié)作

CyclicBarrier多線程協(xié)作

Semaphore并發(fā)數量控制

Exchanger線程信息交互


synchronized,我們相對一段代碼或者一個方法進行多線程安全的控制,

她表示同步的,可以保證一個線程在使用這端代碼或者這個方法是,其他線程不能執(zhí)行這段代碼

要排隊等待

使用方式:同步代碼塊? ? 同步方法(常用)

同步代碼塊:方法(){

synchronized(鎖對象){

}

}

他必須是一個對象,任何對象都可以,但必須保證多個線程共享同一個鎖對象

普通成員方法:鎖對象是本對象

靜態(tài)方法=>鎖對象:本類的class對象

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌租悄,老刑警劉巖套腹,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莺奔,死亡現場離奇詭異询吴,居然都是意外死亡杯矩,警方通過查閱死者的電腦和手機继榆,發(fā)現死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門巾表,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人裕照,你說我怎么就攤上這事攒发。” “怎么了晋南?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵惠猿,是天一觀的道長。 經常有香客問我负间,道長偶妖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任政溃,我火速辦了婚禮趾访,結果婚禮上,老公的妹妹穿的比我還像新娘董虱。我一直安慰自己扼鞋,他們只是感情好申鱼,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著云头,像睡著了一般捐友。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溃槐,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天匣砖,我揣著相機與錄音,去河邊找鬼昏滴。 笑死猴鲫,一個胖子當著我的面吹牛,可吹牛的內容都是我干的谣殊。 我是一名探鬼主播拂共,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蟹倾!你這毒婦竟也來了匣缘?” 一聲冷哼從身側響起猖闪,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鲜棠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后培慌,有當地人在樹林里發(fā)現了一具尸體豁陆,經...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年吵护,在試婚紗的時候發(fā)現自己被綠了盒音。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡馅而,死狀恐怖祥诽,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情瓮恭,我是刑警寧澤雄坪,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站屯蹦,受9級特大地震影響维哈,放射性物質發(fā)生泄漏。R本人自食惡果不足惜登澜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一阔挠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脑蠕,春花似錦购撼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽切揭。三九已至,卻和暖如春锁摔,著一層夾襖步出監(jiān)牢的瞬間廓旬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工谐腰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孕豹,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓十气,卻偏偏與公主長得像励背,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子砸西,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內容

  • 本文主要講了java中多線程的使用方法叶眉、線程同步、線程數據傳遞芹枷、線程狀態(tài)及相應的一些線程函數用法衅疙、概述等。 首先講...
    李欣陽閱讀 2,456評論 1 15
  • Java多線程學習 [-] 一擴展javalangThread類 二實現javalangRunnable接口 三T...
    影馳閱讀 2,959評論 1 18
  • 本文出自 Eddy Wiki 鸳慈,轉載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,130評論 0 14
  • 一:java概述:1饱溢,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境走芋,java的開發(fā)工...
    ZaneInTheSun閱讀 2,654評論 0 11
  • 1.解決信號量丟失和假喚醒 public class MyWaitNotify3{ MonitorObject m...
    Q羅閱讀 880評論 0 1