小豬學(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(),釋放
