- 什么是鎖對象?
每個java對象都有一個鎖對象.而且只有一把鑰匙. - 如何創(chuàng)建鎖對象:
可以使用this關鍵字作為鎖對象,也可以使用所在類的字節(jié)碼文件對應的Class對象作為鎖對象類名.class
-
對象.getClass()
- Java中的每個對象都有一個內置鎖,只有當對象具有同步方法代碼時,內置鎖才會起作用,當進入一個同步的非靜態(tài)方法時,就會自動獲得與類的當前實例(this)相關的鎖,該類的代碼就是正在執(zhí)行的代碼。獲得一個對象的鎖也成為獲取鎖、鎖定對象也可以稱之為監(jiān)視器來指我們正在獲取的鎖對象。
- 因為一個對象只有一個鎖,所有如果一個線程獲得了這個鎖,其他線程就不能獲得了,直到這個線程釋放(或者返回)鎖。也就是說在鎖釋放之前,任何其他線程都不能進入同步代碼(不可以進入該對象的任何同步方法)。釋放鎖指的是持有該鎖的線程退出同步方法,此時,其他線程可以進入該對象上的同步方法。
- 注意
- 只能同步方法(代碼塊),不能同步變量或者類
- 每個對象只有一個鎖
- 不必同步類中的所有方法,類可以同時具有同步方法和非同步方法
- 如果兩個線程要執(zhí)行一個類中的一個同步方法,并且他們使用的是了類的同一個實例(對象)來調用方法,那么一次只有一個線程能夠執(zhí)行該方法,另一個線程需要等待,直到第一個線程完成方法調用,總結就是:一個線程獲得了對象的鎖,其他線程不可以進入該對象的同步方法。
- 如果類同時具有同步方法和非同步方法,那么多個線程仍然可以訪問該類的非同步方法。
- 同步會影響性能(甚至死鎖),優(yōu)先考慮同步代碼塊。
- 如果線程進入sleep() 睡眠狀態(tài),該線程會繼續(xù)持有鎖,不會釋放。
-
同步函數(shù)
- 使用synchronized修飾該函數(shù)則稱作為同步函數(shù)。
- 同步函數(shù)要注意的事項:
- 非靜態(tài)同步函數(shù)的鎖對象是this對象,靜態(tài)函數(shù)的鎖對象是當前所屬類的class文件對象。
- 同步函數(shù)的鎖對象是固定的,無法更改。
- 推薦使用: 同步代碼塊
- 推薦的原因
- 同步代碼塊的鎖對象可以由我們自己指定,同步函數(shù)的鎖對象是固定 的。
- 同步代碼塊可以隨意指定哪個范圍需要被同步,而同步函數(shù)必須是整個函數(shù)都同步, 代碼不靈活。
線程 3. 鎖對象
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
相關閱讀更多精彩內容
- 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...