欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于synchronized修飾靜態(tài)和非靜態(tài)方法

 更新時間:2020年04月16日 14:33:04   作者:經(jīng)典雞翅  
這篇文章主要介紹了基于synchronized修飾靜態(tài)和非靜態(tài)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

前言

最近被問到了這個問題,第一次回答的也是很不好,在此參考網(wǎng)上答案進行整理記錄。供大家學習參考。

Synchronized修飾非靜態(tài)方法

Synchronized修飾非靜態(tài)方法,實際上是對調(diào)用該方法的對象加鎖,俗稱“對象鎖”。

Java中每個對象都有一個鎖,并且是唯一的。假設(shè)分配的一個對象空間,里面有多個方法,相當于空間里面有多個小房間,如果我們把所有的小房間都加鎖,因為這個對象只有一把鑰匙,因此同一時間只能有一個人打開一個小房間,然后用完了還回去,再由JVM 去分配下一個獲得鑰匙的人。

情況1:同一個對象在兩個線程中分別訪問該對象的兩個同步方法

結(jié)果:會產(chǎn)生互斥。

解釋:因為鎖針對的是對象,當對象調(diào)用一個synchronized方法時,其他同步方法需要等待其執(zhí)行結(jié)束并釋放鎖后才能執(zhí)行。正如上面所解釋的,相當于一個對象只有一把鑰匙了,里面的兩個同步方法是兩個房間,因此,同一時間只能用一個鑰匙訪問一個方法。

情況2:不同對象在兩個線程中調(diào)用同一個同步方法

結(jié)果:不會產(chǎn)生互斥。

解釋:因為是兩個對象,就相當于兩個大房子,彼此之間互不干擾,具有兩把鑰匙。鎖針對的是對象,并不是方法,所以可以并發(fā)執(zhí)行,不會互斥。形象的來說就是因為我們每個線程在調(diào)用方法的時候都是new 一個對象,那么就會出現(xiàn)兩個空間,兩把鑰匙。

Synchronized修飾靜態(tài)方法

Synchronized修飾靜態(tài)方法,實際上是對該類對象加鎖,俗稱“類鎖”。

情況1:用類直接在兩個線程中調(diào)用兩個不同的同步方法

結(jié)果:會產(chǎn)生互斥。

解釋:因為對靜態(tài)對象加鎖實際上對類(.class)加鎖,類對象只有一個,可以理解為任何時候都只有一個空間,里面有N個房間,一把鎖,因此房間(同步方法)之間一定是互斥的。

注:上述情況和用單例模式聲明一個對象來調(diào)用非靜態(tài)方法的情況是一樣的,因為永遠就只有這一個對象。所以訪問同步方法之間一定是互斥的。

情況2:用一個類的靜態(tài)對象在兩個線程中調(diào)用靜態(tài)方法或非靜態(tài)方法

結(jié)果:會產(chǎn)生互斥。

解釋:因為是一個對象調(diào)用,同上。都調(diào)用靜態(tài)方法的時候,相當于是同一個類鎖,用的都是同一個類對象。

都調(diào)用非靜態(tài)方法的時候,相當于是同一個對象鎖。

情況3:一個對象在兩個線程中分別調(diào)用一個靜態(tài)同步方法和一個非靜態(tài)同步方法

結(jié)果:不會產(chǎn)生互斥。

解釋:因為雖然是一個對象調(diào)用,但是兩個方法的鎖類型不同,調(diào)用的靜態(tài)方法實際上是類對象在調(diào)用,即這兩個方法產(chǎn)生的并不是同一個對象鎖,因此不會互斥,會并發(fā)執(zhí)行。

例子

pulbic class Something(){
  public synchronized void isSyncA(){}
  public synchronized void isSyncB(){}
  public static synchronized void cSyncA(){}
  public static synchronized void cSyncB(){}
}

那么,加入有Something類的兩個實例a與b,那么下列哪組方法可以被1個以上線程同時訪問呢?

a. x.isSyncA()與 x.isSyncB()
b. x.isSyncA()與 y.isSyncA()
c. x.cSyncA()與 y.cSyncB()
d. x.isSyncA()與 Something.cSyncA()

這里,很清楚的可以判斷:

a,都是對同一個實例的synchronized域訪問,因此不能被同時訪問

b,是針對不同實例的,因此可以同時被訪問

c,因為是static synchronized,所以不同實例之間不會被限制

d,書上的答案是可以被同時訪問的,答案理由是synchronzied的是實例方法與synchronzied的類方法由于鎖定(lock)不同的原因。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決maven沒有打包xml文件的問題

    解決maven沒有打包xml文件的問題

    這篇文章主要介紹了解決maven沒有打包xml文件的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot整合tkMapper的方法

    SpringBoot整合tkMapper的方法

    項目使用SpringBoot2.0,H2數(shù)據(jù)庫,使用了?Lombok?簡化代碼,下面是本人使用SpringBoot整合tkMapper的一個小demo,記錄下來本人在此處踩得坑
    2022-11-11
  • 使用純Java實現(xiàn)一個WebSSH項目的示例代碼

    使用純Java實現(xiàn)一個WebSSH項目的示例代碼

    這篇文章主要介紹了使用純Java實現(xiàn)一個WebSSH項目,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • 解決import包時報 Java 程序包不存在的問題

    解決import包時報 Java 程序包不存在的問題

    你是否也有過在import包時idea報錯說這個包不存在,可是這個包我們看得到確實存在的情況,不要慌,今天這篇文章帶你徹底告別這個問題
    2021-10-10
  • javaSE中異常如何處理舉例詳解

    javaSE中異常如何處理舉例詳解

    程序運行過程中發(fā)生了不正常的情況,這種不正常的情況叫做異常,下面這篇文章主要給大家介紹了關(guān)于javaSE中異常如何處理的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • Java實現(xiàn)石頭剪刀布小游戲

    Java實現(xiàn)石頭剪刀布小游戲

    這篇文章主要為大家詳細介紹了Java實現(xiàn)石頭剪刀布小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Java中的異常處理機制介紹(非常全面!)

    Java中的異常處理機制介紹(非常全面!)

    異??赡苁窃诔绦驁?zhí)行過程中產(chǎn)生的,也可能是程序中throw主動拋出的,下面這篇文章主要給大家介紹了關(guān)于Java中異常處理機制的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • Sharding-Jdbc 自定義復合分片的實現(xiàn)(分庫分表)

    Sharding-Jdbc 自定義復合分片的實現(xiàn)(分庫分表)

    本文主要介紹了Sharding-Jdbc 自定義復合分片的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java中Druid連接池連接超時獲取不到連接的解決

    Java中Druid連接池連接超時獲取不到連接的解決

    這篇文章主要介紹了Java中Druid連接池連接超時獲取不到連接的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Java 8 開發(fā)的 Mybatis 注解代碼生成工具

    Java 8 開發(fā)的 Mybatis 注解代碼生成工具

    MybatisAnnotationTools 是基于 Java8 開發(fā)的一款可以用于自動化生成 MyBatis 注解類的工具,支持配置數(shù)據(jù)源、類路徑,表名去前綴、指定類名前后綴等功能.這篇文章主要介紹了Java 8 開發(fā)的 Mybatis 注解代碼生成工具 ,需要的朋友可以參考下
    2019-07-07

最新評論