在本人學(xué)習(xí)Java的過程中,遇到了很多形形色色的問題惧浴。當(dāng)時(shí)琢磨了好久才琢磨出這樣的總結(jié)存和,貼出來供大家參考參考。以下觀點(diǎn)僅代表本人在學(xué)習(xí)過程中的觀點(diǎn)衷旅,望大家能夠共同討論捐腿,查漏補(bǔ)缺。
在我之前的帖子中柿顶,提過關(guān)于線程同步安全的操作茄袖。我的做法是使用synchronized關(guān)鍵字或者是synchronized方法,又或者是使用Lock同步鎖機(jī)制來進(jìn)行線程同步安全的操作九串。
那么現(xiàn)在問題就來了绞佩,synchronized關(guān)鍵字跟我們的Lock同步鎖機(jī)制又有什么區(qū)別呢?下面我將列出他們的區(qū)別:
1猪钮、
同步代碼塊其實(shí)自身是具有自動(dòng)上鎖品山、自動(dòng)解鎖功能的
Lock鎖機(jī)制則是手動(dòng)解鎖,手動(dòng)上鎖的
2烤低、
用synchronized修飾的同步代碼塊還有同步方法是有同步鎖對象的
Lock鎖機(jī)制是沒有同步鎖對象的
3肘交、
因?yàn)閟ynchronized修飾的同步代碼塊還有同步方法是具有鎖對象的,因此扑馁,可以
調(diào)用notify()涯呻、wait()凉驻、notifyAll()的方法
但是因?yàn)長ock鎖機(jī)制是不具有鎖對象的,因此是不可以去調(diào)用notify()复罐、wait()涝登、
notifyAll()方法的,否則會(huì)發(fā)生報(bào)錯(cuò)
那么如果Lock鎖機(jī)制一定要使用等待喚醒機(jī)制的話效诅,在Java5之后胀滚,我們只能通過創(chuàng)建一個(gè)Condition類對象,然后通過該對象來調(diào)用await()乱投、signal()咽笼、signAll()方法,而這幾個(gè)方法的作用跟notify()戚炫、wait()剑刑、notifyAll()是一樣功能的
同時(shí),我們需要注意的是双肤,synchronized代碼塊施掏、方法,其實(shí)自身是具有同步鎖的杨伙,而這個(gè)同步鎖其监,對于代碼塊而言萌腿,就是這個(gè)代碼塊所屬的那個(gè)那個(gè)方法的對應(yīng)的那個(gè)對象限匣,對于方法而言,就是調(diào)用這個(gè)同步方法的那個(gè)對象
另外毁菱,我們要注意的是:
在同步代碼塊中米死,同步鎖就是這個(gè)代碼塊所屬的那個(gè)對象
在同步方法中(非靜態(tài)),同步鎖就是調(diào)用這個(gè)方法的那個(gè)對象
在同步方法中(靜態(tài))贮庞,同步鎖就是這個(gè)方法所屬的這個(gè)類的字節(jié)碼文件峦筒,即 類名.class;