国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java多線程編程之Synchronized關鍵字詳解

java多線程編程之Synchronized關鍵字詳解

2020-04-28 11:26hapjin JAVA教程

這篇文章主要為大家詳細介紹了java多線程編程之Synchronized關鍵字,感興趣的朋友可以參考一下

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

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

 一、分析

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

java" id="highlighter_320519">
?
1
2
3
4
public class MyObject {
  synchronized public void methodA() {
    //do something....
  }

這里,synchronized 關鍵字鎖住的是當前對象。這也是稱為對象鎖的原因。

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

上面代碼也可寫成這樣:

?
1
2
3
4
5
6
7
8
public class MyObject {
 
  public void methodA() {
    synchronized(this){
      //do something....
    }
  }

二、特點

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

如下:

?
1
2
3
4
5
6
7
8
9
10
public class MyObject {
 
  synchronized public void methodA() {
    //do something....
  }
 
  synchronized public void methodB() {
    //do some other thing
  }
}

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

?
1
2
3
4
5
6
7
8
9
10
public class ThreadA extends Thread {
 
  private MyObject object;
//省略構造方法
  @Override
  public void run() {
    super.run();
    object.methodA();
  }
}

線程A執行methodA()

?
1
2
3
4
5
6
7
8
9
10
public class ThreadB extends Thread {
 
  private MyObject object;
//省略構造方法
  @Override
  public void run() {
    super.run();
    object.methodB();
  }
}

線程B執行methodB()

?
1
2
3
4
5
6
7
8
9
10
11
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()方法。

 三、結論

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

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

四、應用--使用synchronized避免 因數據不一致性而導致讀臟數據的情況

如下示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久天堂电影 | 成人免费视频播放 | 久久精品国产免费 | 亚洲日韩中文字幕一区 | 99草视频 | 亚洲精品久久久久久久久久久久久 | 在线观看一区二区三区视频 | 免费看国产片在线观看 | 视频一区在线 | 99视频精品在线 | 国产欧美日韩一区 | 日韩成人av电影在线观看 | 午夜激情视频在线观看 | 国内精品久久久久久中文字幕 | 日韩精品在线观看中文字幕 | 9l蝌蚪porny中文自拍 | 视频国产一区 | 欧美成人精品一区二区男人看 | 日韩三级电影在线观看 | 完全免费av | 亚洲精品www久久久久久广东 | 久久精品国产免费 | 91精品免费 | 欧美久久久网站 | 日穴视频在线观看 | 欧美日韩亚洲综合 | 自拍视频网站 | 色狠狠网 | 国产激情在线 | 自拍偷拍亚洲一区 | 国产精品久久久久久久久久东京 | 日韩精品观看 | 中文视频一区 | 91国内外精品自在线播放 | 在线播放一区二区三区 | 午夜剧场免费在线观看 | 91在线精品一区二区 | 欧美一区二区三区男人的天堂 | 国产精品久久久久久久9999 | 国产精品香蕉 | av黄色影院 |