線程 3. 鎖對象

  • 什么是鎖對象?
    每個java對象都有一個鎖對象.而且只有一把鑰匙.
  • 如何創(chuàng)建鎖對象:
    可以使用this關鍵字作為鎖對象,也可以使用所在類的字節(jié)碼文件對應的Class對象作為鎖對象
    1. 類名.class

    2. 對象.getClass()

      • Java中的每個對象都有一個內置鎖,只有當對象具有同步方法代碼時,內置鎖才會起作用,當進入一個同步的非靜態(tài)方法時,就會自動獲得與類的當前實例(this)相關的鎖,該類的代碼就是正在執(zhí)行的代碼。獲得一個對象的鎖也成為獲取鎖、鎖定對象也可以稱之為監(jiān)視器來指我們正在獲取的鎖對象。
      • 因為一個對象只有一個鎖,所有如果一個線程獲得了這個鎖,其他線程就不能獲得了,直到這個線程釋放(或者返回)鎖。也就是說在鎖釋放之前,任何其他線程都不能進入同步代碼(不可以進入該對象的任何同步方法)。釋放鎖指的是持有該鎖的線程退出同步方法,此時,其他線程可以進入該對象上的同步方法。
      • 注意
        1. 只能同步方法(代碼塊),不能同步變量或者類
        2. 每個對象只有一個鎖
        3. 不必同步類中的所有方法,類可以同時具有同步方法和非同步方法
        4. 如果兩個線程要執(zhí)行一個類中的一個同步方法,并且他們使用的是了類的同一個實例(對象)來調用方法,那么一次只有一個線程能夠執(zhí)行該方法,另一個線程需要等待,直到第一個線程完成方法調用,總結就是:一個線程獲得了對象的鎖,其他線程不可以進入該對象的同步方法。
        5. 如果類同時具有同步方法和非同步方法,那么多個線程仍然可以訪問該類的非同步方法。
        6. 同步會影響性能(甚至死鎖),優(yōu)先考慮同步代碼塊。
        7. 如果線程進入sleep() 睡眠狀態(tài),該線程會繼續(xù)持有鎖,不會釋放。
    3. 同步函數(shù)

      • 使用synchronized修飾該函數(shù)則稱作為同步函數(shù)。
      • 同步函數(shù)要注意的事項:
        1. 非靜態(tài)同步函數(shù)的鎖對象是this對象,靜態(tài)函數(shù)的鎖對象是當前所屬類的class文件對象。
        2. 同步函數(shù)的鎖對象是固定的,無法更改。
  • 推薦使用: 同步代碼塊
  • 推薦的原因
    1. 同步代碼塊的鎖對象可以由我們自己指定,同步函數(shù)的鎖對象是固定 的。
    2. 同步代碼塊可以隨意指定哪個范圍需要被同步,而同步函數(shù)必須是整個函數(shù)都同步, 代碼不靈活。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,826評論 0 11
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,918評論 0 11
  • 中國是五千多年來的文明古國, 希望我們能把國家的優(yōu)良傳統(tǒng)保持下去。 可現(xiàn)在有多少人輸在了別人的嘴里。
    慧寫心情閱讀 270評論 0 0
  • 痛心回首。那是手,只是回首時,那時少年不在少,路已不是路,人不在是故。何惜也! 那年五一我們相遇 便注定般了在一...
    觸不到的想念閱讀 451評論 0 0
  • 呱呱落地剛來世,至少十八始長成。 拚苦拚干謀事業(yè),功成名就耗時生。 江山不老年年塑,都市逐新代代更。 可嘆蒼生從不...
    徐一村閱讀 308評論 1 15

友情鏈接更多精彩內容