0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

synchronized知識合集1

jf_78858299 ? 來源:JAVA旭陽 ? 作者:JAVA旭陽 ? 2023-05-11 11:07 ? 次閱讀
  • 線程安全
  • 什么是synchronized關(guān)鍵字?
  • synchronized實現(xiàn)方式
    • 1.修飾實例方法
    • 2.修飾靜態(tài)方法
    • 3.修飾代碼塊
  • synchronized關(guān)鍵字底層原理
    • synchronized修飾實例方法
    • monitor鎖是什么?
    • Java對象內(nèi)存布局
    • synchronized修飾代碼塊
  • 鎖優(yōu)化
    • 自旋鎖
    • 鎖粗化
    • 鎖消除
    • 鎖膨脹
  • synchronized關(guān)鍵字實現(xiàn)單例模式
  • synchronized 和 volatile 的區(qū)別?
  • 尾語
  • 參考資料

圖片

前言

今天我們來聊聊synchronized關(guān)鍵字,其可以同時保證三者,實現(xiàn)線程安全。

線程安全

在介紹synchronized關(guān)鍵字之前,我們得強調(diào)一下什么是線程安全,所謂線程安全:

當(dāng)多個線程同時訪問一個對象時, 如果不用考慮這些線程在運行時環(huán)境下的調(diào)度和交替執(zhí)行, 也不需要進行額外的同步, 或者在調(diào)用方進行任何其他的協(xié)調(diào)操作, 調(diào)用這個對象的行為都可以獲得正確的結(jié)果, 那就稱這個對象是線程安全的

什么是synchronized關(guān)鍵字?

在 Java 早期版本中,synchronized 屬于 重量級鎖 ,效率低下;不過在 Java 6 之后,Java 官方對從 JVM 層面對 synchronized 較大優(yōu)化,所以現(xiàn)在的 synchronized 鎖效率也優(yōu)化得非常不錯。目前不論是各種開源框架還是 JDK 源碼都大量使用了 synchronized 關(guān)鍵字

synchronized實現(xiàn)方式

synchronized的使用其實比較簡單,可以用它來修飾實例方法和靜態(tài)方法,也可以用來修飾代碼塊。我們需要注意的是synchronized是一個對象鎖,也就是它鎖的是一個對象。我們無論使用哪一種方法,synchronized都需要有一個鎖對象

  1. 修飾實例方法
  2. 修飾靜態(tài)方法
  3. 修飾代碼塊

1.修飾實例方法

synchronized修飾實例方法, 在方法上加上synchronized關(guān)鍵字即可。

public class SynchronizedTest1 {
    public synchronized void test() {
        System.out.println("synchronized 修飾 方法");
    }
}

此時,synchronized加鎖的對象就是這個方法所在實例的本身,作用于當(dāng)前實例加鎖,進入同步代碼前要獲得 當(dāng)前實例的鎖

補充一個常見的面試題:構(gòu)造方法可以用synchronized關(guān)鍵字修飾嗎?

不能,也不需要,因為構(gòu)造方法本身就是線程安全的

2.修飾靜態(tài)方法

synchronized修飾靜態(tài)方法的使用與實例方法并無差別,在靜態(tài)方法上加上synchronized關(guān)鍵字即可

public static synchronized void test(){
       i++;
}

由于靜態(tài)方法不屬于任何一個實例對象,歸整個類所有,不依賴于類的特定實例,被類的所有實例共享。給靜態(tài)方法加synchronized鎖,會作用于類的所有對象實例 ,進入同步代碼前要獲得 當(dāng)前靜態(tài)方法所在類的Class對象的鎖 。

有一點我們需要知道:如果一個線程 A 調(diào)用一個實例對象的非靜態(tài) synchronized 方法,而線程 B 需要調(diào)用這個實例對象所屬類的靜態(tài) synchronized 方法,是允許的,不會發(fā)生互斥現(xiàn)象, 因為訪問靜態(tài) synchronized 方法占用的鎖是當(dāng)前類的鎖,而訪問非靜態(tài) synchronized 方法占用的鎖是當(dāng)前實例對象鎖 。

3.修飾代碼塊

synchronized修飾代碼塊需要傳入一個對象。

public class SynchronizedTest2 {
    public void test() {
        synchronized (this) {
            System.out.println("synchronized 修飾 代碼塊");
        }
    }
}

此時synchronized加鎖對象即為傳入的這個對象實例,指定加鎖對象,進入同步代碼庫前要獲得給定對象的鎖 需要注意的是這里的**this **:

  1. synchronized(object) ,表示進入同步代碼庫前要獲得 給定對象的鎖
  2. synchronized(類.class) ,表示進入同步代碼前要獲得 給定 Class 的鎖
  3. 最好不要使用 synchronized(String a) ,因為在 JVM 中,字符串常量池具有緩存功能, 如果我們多次加鎖,會加鎖在同一個對象上
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2943

    瀏覽量

    104096
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67765
  • 線程安全
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    2452
收藏 人收藏

    評論

    相關(guān)推薦

    關(guān)于labview的論文合集1

    關(guān)于labview的論文合集1
    發(fā)表于 09-23 13:45

    求解有沒有類似于電子發(fā)燒友這樣的分版塊的知識合集?

    求解有沒有類似于電子發(fā)燒友這樣的分版塊的知識合集
    發(fā)表于 09-27 00:48

    有線通信的知識點大合集,絕對實用

    有線通信的知識點大合集,絕對實用
    發(fā)表于 01-17 08:24

    SPI協(xié)議的知識點大合集,絕對實用

    SPI協(xié)議的知識點大合集,絕對實用
    發(fā)表于 02-17 07:31

    stm32f103中的電路知識點大合集,錯過后悔

    stm32f103中的電路知識點大合集,錯過后悔
    發(fā)表于 02-21 06:49

    Synchronized multi-spark modul

    Synchronized multi-spark module (SMSM) for Electronic Ignition Devices (EID)
    發(fā)表于 12-29 09:09 ?810次閱讀
    <b class='flag-5'>Synchronized</b> multi-spark modul

    電工技術(shù)基礎(chǔ)知識教程合集免費下載

    本文檔的主要內(nèi)容詳細介紹的是電工技術(shù)基礎(chǔ)知識教程合集免費下載包括了:常用低壓供配電系統(tǒng) ,電工安全的基本知識 ,常用儀表與測量 。
    發(fā)表于 08-24 08:00 ?134次下載
    電工技術(shù)基礎(chǔ)<b class='flag-5'>知識</b>教程<b class='flag-5'>合集</b>免費下載

    Java并發(fā)編程中線程同步的常用手段synchronized用法

    變量的修改能夠及時可見,獲得鎖的線程操作完畢后會將所數(shù)據(jù)刷新到共享內(nèi)存區(qū)[1] 有序性:不解決重排序,但保證有序性 synchronized用法有三個: 修飾實例方法 修飾靜態(tài)方法 修飾代碼塊 1. 修飾實例方法
    的頭像 發(fā)表于 04-04 11:30 ?1116次閱讀
    Java并發(fā)編程中線程同步的常用手段<b class='flag-5'>synchronized</b>用法

    電力基礎(chǔ)知識合集

    電力基礎(chǔ)知識合集
    發(fā)表于 03-14 16:35 ?0次下載

    詳細介紹synchronized和Object的關(guān)鍵方法和虛擬機實現(xiàn)原理

    編程過程中經(jīng)常會遇到線程的同步問題,Java 中對同步問題的解決方案比較多(synchronized、JUC、原子操作、volatile、條件變量等),其中synchronized 最方便、簡單易用,也是java 編程中使用最多的臨界區(qū)保護方案。
    的頭像 發(fā)表于 03-13 10:06 ?1129次閱讀

    synchronized知識合集2

    * 線程安全 * 什么是synchronized關(guān)鍵字? * synchronized實現(xiàn)方式 * 1.修飾實例方法 * 2.修飾靜態(tài)方法 * 3.修飾代碼塊
    的頭像 發(fā)表于 05-11 11:08 ?344次閱讀

    synchronized的原理與四種用法介紹

    JDK提供的鎖分兩種,一種是JVM實現(xiàn)的synchronized,是java的關(guān)鍵字,因此在這個關(guān)鍵字作用對象的范圍內(nèi)都是可以保證原子性的,主要是依賴特殊的CPU指令。另一種是JDK提供的代碼層面的鎖Lock。
    的頭像 發(fā)表于 06-09 16:13 ?794次閱讀
    <b class='flag-5'>synchronized</b>的原理與四種用法介紹

    synchronized 的幾種錯誤用法

    synchronized 在我們平常工作中也是挺常用的, 對于擺脫多線程問題很有幫助。但是如果synchronized被錯誤使用時,可能會給我們帶來很多麻煩。 在本文中,我們將討論與同步相關(guān)的一些
    的頭像 發(fā)表于 10-09 10:25 ?493次閱讀

    synchronized的鎖膨脹

    synchronized void sync1 ( ) { } // 鎖的是SynchronizedTest.class對象 public static void sync2 ( ) { synchronized
    的頭像 發(fā)表于 10-10 16:58 ?390次閱讀
    <b class='flag-5'>synchronized</b>的鎖膨脹

    C語言編程必備知識合集

    電子發(fā)燒友網(wǎng)站提供《C語言編程必備知識合集.zip》資料免費下載
    發(fā)表于 11-21 09:34 ?0次下載
    C語言編程必備<b class='flag-5'>知識</b><b class='flag-5'>合集</b>