一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩在线视频二区 | 91插视频 | 公妇乱淫在线播放免费观看 | 欧美操大逼视频 | 小早川怜子在线播放精品 | 国产精品一区二区久久 | 亚洲 国产精品 日韩 | 校花被老头夺去第一次动图 | 成人国产网站v片免费观看 成人国产精品视频 | 日本高清视频在线观看 | 亚洲天天做夜夜做天天欢 | 国产在线精品观看 | 91茄子| 大肥婆丰满大肥奶bbw肥 | 国产日韩精品一区二区在线观看 | 青涩体验在线观看未删减 | 欧美1区 | 亚洲国产精品无圣光一区二区 | 亚洲国产果果在线播放在线 | 精品视频中文字幕 | 小草高清视频免费直播 | 久久国产36精品色熟妇 | 日本道在线播放 | 爱爱调教 | 日本久本草精品 | 爽好大快深点一视频 | 婷婷网址 | 日本高清免费中文字幕不卡 | 女教师被学生糟蹋三天 | 成人免费视频一区二区三区 | 香蕉国产成版人视频在线观看 | 国产剧情一区二区三区 | 91人人在线 | 亚洲欧美综合在线观看 | 性欧美高清强烈性视频 | gangbang日本| 日韩在线观看一区二区不卡视频 | 国产日韩欧美综合一区二区三区 | 啊好痛嗯轻一点免费 | 天天插在线视频 | 99福利影院 |