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

java多線程編程之Synchronized關(guān)鍵字詳解

 更新時間:2016年05月14日 18:23:54   作者:hapjin  
這篇文章主要為大家詳細(xì)介紹了java多線程編程之Synchronized關(guān)鍵字,感興趣的朋友可以參考一下

本文介紹JAVA多線程中的synchronized關(guān)鍵字作為對象鎖的一些知識點。

所謂對象鎖,就是就是synchronized 給某個對象 加鎖。關(guān)于 對象鎖 可參考:這篇文章

 一、分析

synchronized可以修飾實例方法,如下形式:

public class MyObject {
  synchronized public void methodA() {
    //do something....
  }

這里,synchronized 關(guān)鍵字鎖住的是當(dāng)前對象。這也是稱為對象鎖的原因。

為啥鎖住當(dāng)前對象?因為 methodA()是個實例方法,要想執(zhí)行methodA(),需要以 對象.方法() 的形式進(jìn)行調(diào)用(obj.methodA(),obj是MyObject類的一個對象,synchronized就是把obj這個對象加鎖了)。

上面代碼也可寫成這樣:

public class MyObject {

  public void methodA() {
    synchronized(this){
      //do something....
    }
  }
 

二、特點

使用synchronized關(guān)鍵字同步一個明顯的特點是:MyObject類中定義有多個synchronized修飾的實例方法時,若多個線程擁有同一個MyObject類的對象,則這些方法只能以同步的方式執(zhí)行。即,執(zhí)行完一個synchronized修飾的方法后,才能執(zhí)行另一個synchronized修飾的方法。

如下:

public class MyObject {

  synchronized public void methodA() {
    //do something....
  }

  synchronized public void methodB() {
    //do some other thing
  }
}

MyObject類中有兩個synchronized修飾的方法。

public class ThreadA extends Thread {

  private MyObject object;
//省略構(gòu)造方法
  @Override
  public void run() {
    super.run();
    object.methodA();
  }
}

線程A執(zhí)行methodA()

public class ThreadB extends Thread {

  private MyObject object;
//省略構(gòu)造方法
  @Override
  public void run() {
    super.run();
    object.methodB();
  }
}

線程B執(zhí)行methodB()

public class Run {
  public static void main(String[] args) {
    MyObject object = new MyObject();

    //線程A與線程B 持有的是同一個對象:object
    ThreadA a = new ThreadA(object);
    ThreadB b = new ThreadB(object);
    a.start();
    b.start();
  }
}

由于線程A和線程B持有同一個MyObject類的對象object,盡管這兩個線程需要調(diào)用不同的方法,但是必須是同步的,比如:線程B需要等待線程A執(zhí)行完了methodA()方法之后,它才能執(zhí)行methodB()方法。

 三、結(jié)論

從上可以看出,本文中講述的 synchronized 鎖的范圍是整個對象。如果一個類中有多個synchronized修飾的同步方法,且多個線程持有該類的同一個對象(該類的相同的對象),盡管它們調(diào)用不同的方法,各個方法的執(zhí)行也是同步的。

如果各個同步的方法之間沒有共享變量,或者說各個方法之間沒有聯(lián)系,但也只能同步執(zhí)行,這會影響效率。

四、應(yīng)用--使用synchronized避免 因數(shù)據(jù)不一致性而導(dǎo)致讀臟數(shù)據(jù)的情況

如下示例:

public class MyObject {

  private String userName = "b";
  private String passWord = "bb";
  
  synchronized public void methodA(String userName, String passWord) {
    this.userName = userName;
    try{
      Thread.sleep(5000);
    }catch(InterruptedException e){
      
    }
    this.passWord = passWord;
  }

  synchronized public void methodB() {
    System.out.println("userName" + userName + ": " + "passWord" + passWord);
  }
}

methodA()負(fù)責(zé)更改用戶名和密碼。在現(xiàn)實中,一個用戶名對應(yīng)著一個密碼。

methodB()負(fù)責(zé)讀取用戶名和密碼。

如果methodB()沒有用synchronized 修飾,線程A在調(diào)用methodA()執(zhí)行到第7行,更改了用戶名,因某種原因(比如在第9行睡眠了)放棄了CPU。

此時,如果線程B去執(zhí)行methodB(),那么讀取到的用戶名是線程A更改了的用戶名("a"),但是密碼卻是原來的密碼("bb")。因為,線程A睡眠了,還沒有來得及更改密碼。

但是,如果methodB()用synchronized修飾,那么線程B只能等待線程A執(zhí)行完畢之后(即改了用戶名,也改了密碼),才能執(zhí)行methodB讀取用戶名和密碼。因此,就避免了數(shù)據(jù)的不一致性而導(dǎo)致的臟讀問題。

以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)java程序設(shè)計有所幫助。

相關(guān)文章

  • IDEA集成Gitee碼云的實現(xiàn)步驟

    IDEA集成Gitee碼云的實現(xiàn)步驟

    本文主要介紹了IDEA集成Gitee碼云的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java單鏈表的增刪改查與面試題詳解

    Java單鏈表的增刪改查與面試題詳解

    單鏈表是鏈表的其中一種基本結(jié)構(gòu)。一個最簡單的結(jié)點結(jié)構(gòu)如圖所示,它是構(gòu)成單鏈表的基本結(jié)點結(jié)構(gòu)。在結(jié)點中數(shù)據(jù)域用來存儲數(shù)據(jù)元素,指針域用于指向下一個具有相同結(jié)構(gòu)的結(jié)點。 因為只有一個指針結(jié)點,稱為單鏈表
    2022-09-09
  • Java lambda 循環(huán)累加求和代碼

    Java lambda 循環(huán)累加求和代碼

    這篇文章主要介紹了Java lambda 循環(huán)累加求和代碼,具有很的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 詳解MyEclipse中搭建spring-boot+mybatis+freemarker框架

    詳解MyEclipse中搭建spring-boot+mybatis+freemarker框架

    這篇文章主要介紹了詳解MyEclipse中搭建spring-boot+mybatis+freemarker框架,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • plsql實現(xiàn)DES對稱加密 Java解密

    plsql實現(xiàn)DES對稱加密 Java解密

    這篇文章主要介紹了plsql實現(xiàn)DES對稱加密 Java解密的方法,幫助大家更好的理解和學(xué)習(xí)使用Oracle與Java,感興趣的朋友可以了解下
    2021-02-02
  • 深入解析JVM對dll文件和對類的裝載過程

    深入解析JVM對dll文件和對類的裝載過程

    這篇文章主要介紹了JVM對dll文件的裝載和對類的裝載過程,針對Java在Windows下的一些運(yùn)行情況作出講解,需要的朋友可以參考下
    2015-11-11
  • 詳細(xì)介紹Java中的各種鎖

    詳細(xì)介紹Java中的各種鎖

    不少同學(xué)開始慢慢接觸多線時候,對線程之間為了保障數(shù)據(jù)安全性,一致性有所了解,本文詳細(xì)解介紹java中的21種鎖 ,需要的朋友可以參考下
    2021-06-06
  • Spring Boot如何使用JDBC獲取相關(guān)的數(shù)據(jù)詳解

    Spring Boot如何使用JDBC獲取相關(guān)的數(shù)據(jù)詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot如何使用JDBC獲取相關(guān)數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 如何利用Spring?Boot?監(jiān)控?SQL?運(yùn)行情況

    如何利用Spring?Boot?監(jiān)控?SQL?運(yùn)行情況

    這篇文章主要介紹了如何利用Spring?Boot監(jiān)控SQL運(yùn)行情況,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • Java計算代碼段執(zhí)行時間的詳細(xì)過程

    Java計算代碼段執(zhí)行時間的詳細(xì)過程

    java里計算代碼段執(zhí)行時間可以有兩種方法,一種是毫秒級別的計算,另一種是更精確的納秒級別的計算,這篇文章主要介紹了java計算代碼段執(zhí)行時間,需要的朋友可以參考下
    2023-02-02

最新評論