程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java多線程編程之Synchronized症結字詳解

java多線程編程之Synchronized症結字詳解

編輯:關於JAVA

java多線程編程之Synchronized症結字詳解。本站提示廣大學習愛好者:(java多線程編程之Synchronized症結字詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是java多線程編程之Synchronized症結字詳解正文


本文引見JAVA多線程中的synchronized症結字作為對象鎖的一些常識點。

所謂對象鎖,就是就是synchronized 給某個對象 加鎖。關於 對象鎖 可參考:這篇文章

 1、剖析

synchronized可以潤飾實例辦法,以下情勢:

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

這裡,synchronized 症結字鎖住的是以後對象。這也是稱為對象鎖的緣由。

為啥鎖住以後對象?由於 methodA()是個實例辦法,要想履行methodA(),須要以 對象.辦法() 的情勢停止挪用(obj.methodA(),obj是MyObject類的一個對象,synchronized就是把obj這個對象加鎖了)。

下面代碼也可寫成如許:

public class MyObject {

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

2、特色

應用synchronized症結字同步一個顯著的特色是:MyObject類中界說有多個synchronized潤飾的實例辦法時,若多個線程具有統一個MyObject類的對象,則這些辦法只能以同步的方法履行。即,履行完一個synchronized潤飾的辦法後,能力履行另外一個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;
//省略結構辦法
  @Override
  public void run() {
    super.run();
    object.methodA();
  }
}

線程A履行methodA()

public class ThreadB extends Thread {

  private MyObject object;
//省略結構辦法
  @Override
  public void run() {
    super.run();
    object.methodB();
  }
}

線程B履行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,雖然這兩個線程須要挪用分歧的辦法,然則必需是同步的,好比:線程B須要期待線程A履行完了methodA()辦法以後,它能力履行methodB()辦法。

 3、結論

從上可以看出,本文中講述的 synchronized 鎖的規模是全部對象。假如一個類中有多個synchronized潤飾的同步辦法,且多個線程持有該類的統一個對象(該類的雷同的對象),雖然它們挪用分歧的辦法,各個辦法的履行也是同步的。

假如各個同步的辦法之間沒有同享變量,或許說各個辦法之間沒有接洽,但也只能同步履行,這會影響效力。

4、運用--應用synchronized防止 因數據紛歧致性而招致讀髒數據的情形

以下示例:

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()擔任更改用戶名和暗碼。在實際中,一個用戶名對應著一個暗碼。

methodB()擔任讀取用戶名和暗碼。

假如methodB()沒有效synchronized 潤飾,線程A在挪用methodA()履行到第7行,更改了用戶名,因某種緣由(好比在第9行睡眠了)廢棄了CPU。

此時,假如線程B去履行methodB(),那末讀取到的用戶名是線程A更改了的用戶名("a"),然則暗碼倒是本來的暗碼("bb")。由於,線程A睡眠了,還沒有來得及更改暗碼。

然則,假如methodB()用synchronized潤飾,那末線程B只能期待線程A履行終了以後(即改了用戶名,也改了暗碼),能力履行methodB讀取用戶名和暗碼。是以,就防止了數據的紛歧致性而招致的髒讀成績。

以上就是本文的全體內容,願望對年夜家進修java法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved