精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

synchronized知識合集1

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

圖片

前言

今天我們來聊聊synchronized關鍵字,其可以同時保證三者,實現線程安全。

線程安全

在介紹synchronized關鍵字之前,我們得強調一下什么是線程安全,所謂線程安全:

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

什么是synchronized關鍵字?

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

synchronized實現方式

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

  1. 修飾實例方法
  2. 修飾靜態方法
  3. 修飾代碼塊

1.修飾實例方法

synchronized修飾實例方法, 在方法上加上synchronized關鍵字即可。

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

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

補充一個常見的面試題:構造方法可以用synchronized關鍵字修飾嗎?

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

2.修飾靜態方法

synchronized修飾靜態方法的使用與實例方法并無差別,在靜態方法上加上synchronized關鍵字即可

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

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

有一點我們需要知道:如果一個線程 A 調用一個實例對象的非靜態 synchronized 方法,而線程 B 需要調用這個實例對象所屬類的靜態 synchronized 方法,是允許的,不會發生互斥現象, 因為訪問靜態 synchronized 方法占用的鎖是當前類的鎖,而訪問非靜態 synchronized 方法占用的鎖是當前實例對象鎖

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 中,字符串常量池具有緩存功能, 如果我們多次加鎖,會加鎖在同一個對象上
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2958

    瀏覽量

    104553
  • 代碼
    +關注

    關注

    30

    文章

    4750

    瀏覽量

    68357
  • 線程安全
    +關注

    關注

    0

    文章

    13

    瀏覽量

    2456
收藏 人收藏

    評論

    相關推薦

    關于labview的論文合集1

    關于labview的論文合集1
    發表于 09-23 13:45

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

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

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

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

    SPI協議的知識點大合集,絕對實用

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

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

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

    Synchronized multi-spark modul

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

    電工技術基礎知識教程合集免費下載

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

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

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

    電力基礎知識合集

    電力基礎知識合集
    發表于 03-14 16:35 ?0次下載

    詳細介紹synchronized和Object的關鍵方法和虛擬機實現原理

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

    synchronized知識合集2

    * 線程安全 * 什么是synchronized關鍵字? * synchronized實現方式 * 1.修飾實例方法 * 2.修飾靜態方法 * 3.修飾代碼塊
    的頭像 發表于 05-11 11:08 ?385次閱讀

    synchronized的原理與四種用法介紹

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

    synchronized 的幾種錯誤用法

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

    synchronized的鎖膨脹

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

    C語言編程必備知識合集

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