JAVA入門小小白學(xué)習(xí)中ing(同步方法、線程之間的通信)

小豬學(xué)習(xí)

小小白慢慢學(xué)習(xí)中ing 第三十天

努力努力


本日內(nèi)容(同步方法、線程之間的通信)


1、同步方法

同步代碼塊:使用synchronized關(guān)鍵字包裹了一塊代碼,讓這塊代碼同步執(zhí)行。就是每次只能一個(gè)線程來執(zhí)行。

同步方法:使用synchronized關(guān)鍵字修飾一個(gè)方法,這個(gè)方法同步執(zhí)行。就是每次只能一個(gè)線程來執(zhí)行。

普通的方法:對(duì)象調(diào)用。鎖定的對(duì)象,就是this對(duì)象。

靜態(tài)的方法:類調(diào)用。鎖定的對(duì)象,就是類名.class

同步的原理:利用對(duì)象的互斥鎖。

每個(gè)線程來訪問,只能有一個(gè)線程進(jìn)入執(zhí)行,第一個(gè)動(dòng)作鎖對(duì)象(上鎖)。來保證其他線程不能進(jìn)入執(zhí)行。等到該線程結(jié)束這個(gè)同步代碼塊或者同步方法,釋放鎖對(duì)象(開鎖),才允許其他的線程來訪問。

線程安全的類:

????????StringBuffer

????????Vector

????????HashTable

????????Collections,集合的工具類

2、線程之間的通信

線程之間的通信:wait(),notify(),notifyAll()

????????wait()——>讓線程進(jìn)入阻塞狀態(tài),暫停執(zhí)行。一直阻塞

????????notify()——>喚醒線程,wait()住的線程,被喚醒。如果多個(gè)線程wait()了,喚醒其中的一個(gè)。

????????notifyAll()——>喚醒所有。

語法要求:必須在同步中,由同步的鎖對(duì)象來調(diào)用。否則java.lang.IllegalMonitorStateException異常。

生產(chǎn)者消費(fèi)者模型:

????????生產(chǎn)者(線程t1)負(fù)責(zé)生產(chǎn)產(chǎn)品,存入容器中(固定容量),消費(fèi)者(線程t2)從容器中獲取產(chǎn)品消費(fèi)掉。

容器:

????????生產(chǎn)者:持有資源,生產(chǎn)產(chǎn)品,存入容器中

????????消費(fèi)者:持有資源,消費(fèi)掉產(chǎn)品。

?

????????容器滿了:最多裝8個(gè)雞蛋

????????生產(chǎn)者:持有資源,暫停執(zhí)行——直到容器還能繼續(xù)裝。

????????鎖對(duì)象.wait()——>會(huì)讓線程進(jìn)入阻塞狀態(tài)。暫停執(zhí)行。notify(),notifyAll()

????????消費(fèi)者:持有資源,直接消費(fèi)。。

????????容器空了:最少0個(gè)。

????????生產(chǎn)者:持有資源,生產(chǎn),存入。。

????????消費(fèi)者:持有資源,暫停執(zhí)行——直到容器中有產(chǎn)品

????????鎖對(duì)象.wait()——>會(huì)讓線程進(jìn)入阻塞狀態(tài)。暫停執(zhí)行。notify(),notifyAll()

代碼分析:

????????1、產(chǎn)品類:Egg()-->id

????????2、產(chǎn)生者:線程

????????????????cpu執(zhí)行,run()-->生產(chǎn)雞蛋,裝入容器

????????3、消費(fèi)者:線程

????????????????????cpu執(zhí)行,run()-->從容器中獲取雞蛋,吃掉(打印。。)

容器對(duì)象:

????????Class實(shí)現(xiàn)容器

數(shù)組: Egg[] arr = new Egg[8];

集合:棧,后進(jìn)先出

同步的代碼:

????????鎖的是容器對(duì)象:

wait()和sleep()方法的區(qū)別:

???出處不同:

????????????????sleep()方法是Thread類中定義的。

????????????????wait()方法是Object類中定義的。

????????????????解除阻塞的方式不同

????????????????sleep()是時(shí)間到,自己醒。

????????????????wait()方法等待被喚醒:notify(),或者是notifyAll()

????????????????對(duì)鎖資源的釋放情況

????????????????sleep(),不釋放,抱著不撒手

????????????????wait(),釋放



希望我能堅(jiān)持住每天堅(jiān)持記錄著 ...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請(qǐng)注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,305評(píng)論 0 14
  • 一、進(jìn)程和線程 進(jìn)程 進(jìn)程就是一個(gè)執(zhí)行中的程序?qū)嵗?,每個(gè)進(jìn)程都有自己獨(dú)立的一塊內(nèi)存空間,一個(gè)進(jìn)程中可以有多個(gè)線程。...
    阿敏其人閱讀 2,714評(píng)論 0 13
  • 編程中我們會(huì)遇到多少挫折?表放棄,沙漠盡頭必是綠洲。 多線程: 1、進(jìn)程和線程: 進(jìn)程:正在進(jìn)行的程序。每一個(gè)進(jìn)程...
    樸實(shí)無華的程序猿閱讀 355評(píng)論 0 0
  • 開啟線程方式 1. 繼承自Thread類的線程 2. 實(shí)現(xiàn)Runnable接口的線程 實(shí)現(xiàn)Runnable接口和繼...
    小的橘子閱讀 446評(píng)論 0 1
  • 相關(guān)概念 面向?qū)ο蟮娜齻€(gè)特征 封裝,繼承,多態(tài).這個(gè)應(yīng)該是人人皆知.有時(shí)候也會(huì)加上抽象. 多態(tài)的好處 允許不同類對(duì)...
    東經(jīng)315度閱讀 2,212評(píng)論 0 8

友情鏈接更多精彩內(nèi)容