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

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

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

synchronized知識(shí)合集1

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

圖片

前言

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

線程安全

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

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

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

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

synchronized實(shí)現(xiàn)方式

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

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

1.修飾實(shí)例方法

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

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

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

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

不能,也不需要,因?yàn)闃?gòu)造方法本身就是線程安全的

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

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

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

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

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

3.修飾代碼塊

synchronized修飾代碼塊需要傳入一個(gè)對(duì)象。

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

此時(shí)synchronized加鎖對(duì)象即為傳入的這個(gè)對(duì)象實(shí)例,指定加鎖對(duì)象,進(jìn)入同步代碼庫(kù)前要獲得給定對(duì)象的鎖 需要注意的是這里的**this **:

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

    關(guān)注

    19

    文章

    2973

    瀏覽量

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

    關(guān)注

    30

    文章

    4810

    瀏覽量

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

    關(guān)注

    0

    文章

    13

    瀏覽量

    2469
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    求解有沒(méi)有類(lèi)似于電子發(fā)燒友這樣的分版塊的知識(shí)合集?

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

    有線通信的知識(shí)點(diǎn)大合集,絕對(duì)實(shí)用

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

    SPI協(xié)議的知識(shí)點(diǎn)大合集,絕對(duì)實(shí)用

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

    stm32f103中的電路知識(shí)點(diǎn)大合集,錯(cuò)過(guò)后悔

    stm32f103中的電路知識(shí)點(diǎn)大合集,錯(cuò)過(guò)后悔
    發(fā)表于 02-21 06:49

    Synchronized multi-spark modul

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

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

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

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

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

    電力基礎(chǔ)知識(shí)點(diǎn)合集

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

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

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

    synchronized知識(shí)合集2

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

    synchronized的原理與四種用法介紹

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

    synchronized 的幾種錯(cuò)誤用法

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

    synchronized的鎖膨脹

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

    C語(yǔ)言編程必備知識(shí)合集

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