2022-08-03 第七小組 房雪瑩 學(xué)習(xí)筆記
今日學(xué)習(xí)內(nèi)容:
1.鎖:
?synchronized多線程并發(fā)編程
重量級(jí)鎖
JDK1.6為了減少獲得鎖和釋放鎖帶來的性能消耗引入的偏鎖和輕量級(jí)鎖
synchronized有三種方式來加鎖,分別是
1)修飾實(shí)例的方法,作用于當(dāng)前實(shí)例加鎖,進(jìn)入同步代碼前要獲得當(dāng)前實(shí)例的鎖
2)靜態(tài)方法,作用于當(dāng)前類對(duì)象加鎖,進(jìn)入同步代碼前要獲得的當(dāng)前類對(duì)象的鎖
3)代碼塊,指定加鎖對(duì)象,對(duì)給定的對(duì)象加鎖,進(jìn)入同步代碼塊之前要獲得給定對(duì)象的鎖、
2.實(shí)例方法:(它的鎖)調(diào)用該方法的實(shí)例
靜態(tài)方法:類對(duì)象(.class)
this:調(diào)用該方法的實(shí)例對(duì)象
類對(duì)象:類對(duì)象
其實(shí)就是操作共享數(shù)據(jù)的代碼
共享數(shù)據(jù),多個(gè)線程共同操作的變量,都可以充當(dāng)鎖
當(dāng)前使用同步方法時(shí),synchronized鎖的東西就是this當(dāng)前對(duì)象
3.關(guān)于同步方法:
1.同步方法依然涉及到同步鎖對(duì)象,不需要我們寫出來
2.非靜態(tài)的同步方法,同步鎖就是this
靜態(tài)的同步方法,同步監(jiān)視就是類本身
4.同步代碼塊:
1.選好同步監(jiān)視器(鎖)推薦使用類對(duì)象,第三方對(duì)象,this
2.在實(shí)現(xiàn)接口創(chuàng)建線程類中,同步代碼塊不可以用this來充當(dāng)同步鎖
同步的方法,解決了線程安全的問題
操作同步代碼時(shí),只有一個(gè)線程能夠參與,其他線程等待
相當(dāng)于一個(gè)單線程的過程,效率低。
5.死鎖
死鎖是這樣的一種情形,多個(gè)線程同時(shí)被阻塞,他們中的一個(gè)或者全部
都在等待某個(gè)資源的釋放,由于線程無限制的阻塞,程序就不可能正常釋放
6.java死鎖產(chǎn)生的四個(gè)必要條件
1.互斥使用,當(dāng)資源被一個(gè)線程使用,別的線程不能使用
2.不能搶占,資源的請(qǐng)求者不能強(qiáng)制從占用者中搶奪資源,資源只能從占有者手動(dòng)釋放
3.請(qǐng)求和保持
4.循環(huán)等待,存在一個(gè)等待隊(duì)列,P1占有P2資源,P2占用P3的資源
P3占有P1的資源。形成了一個(gè)等待環(huán)路
7.線程重入
任意線程在拿到鎖之后,再次獲取該鎖不會(huì)被該鎖所阻礙
線程不會(huì)被自己鎖死的,這就叫線程重入,synchronized可重入鎖
8.Object類對(duì)多線程的支持
wait():
wait(Long timeout):當(dāng)前線程進(jìn)入等待狀態(tài)
notify():喚醒正在等待的下一個(gè)線程
notifyALL():喚醒正在等待的所有線程
9.線程的通信
比如兩條線程,共同運(yùn)行。
線程A 如果先走,線程B就要等待,等A走完,喚醒B,B再走
10.方法的總結(jié):
1.Thread的兩個(gè)靜態(tài)方法:
sleep釋放CPU資源,但不會(huì)釋放鎖
yield方法,釋放CPU 的執(zhí)行權(quán),保留了CPU的執(zhí)行資格(不常用)
2.join方法:yield出讓了執(zhí)行權(quán),join就加入進(jìn)來
3.wait方法:釋放CPU資源,釋放鎖
notify:?jiǎn)拘颜诘却南乱粋€(gè)線程
notifyALL:?jiǎn)拘颜诘却乃芯€程
11.線程的退出
使用退出標(biāo)志,線程正常退出,run方法結(jié)束后線程終止
不要使用stop方法,System.exit(-1)
12.線程的常用方法:
Thread類中的方法
1.start方法:?jiǎn)?dòng)當(dāng)前線程,執(zhí)行run方法
2.run:
3.currentThread:靜態(tài)方法,獲取當(dāng)前正在執(zhí)行的線程
4.getId:返回此線程的唯一標(biāo)識(shí)
5.setName(String):設(shè)置當(dāng)前線程的name
6.getName:獲取當(dāng)前線程的name
7.getPriority:獲取當(dāng)前線程的優(yōu)先級(jí)
8.setPriority(int):設(shè)置當(dāng)前線程的優(yōu)先級(jí)
9.getState():獲取當(dāng)前線程的聲明周期
10.interrupt():中斷線程的執(zhí)行
11.interrupted():查看當(dāng)前線程是否中斷

浙公網(wǎng)安備 33010602011771號(hào)