成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java中的synchronized關(guān)鍵字

lylwyy2016 / 2079人閱讀

摘要:的關(guān)鍵字中的塊使用關(guān)鍵字進(jìn)行標(biāo)記。由于每個(gè)類只有一個(gè)類對(duì)象存在于中,因此全局同時(shí)只有一個(gè)線程能夠進(jìn)入到同一個(gè)類的靜態(tài)同步方法中。同步代碼塊使這種期望成為可能。注意同步代碼塊如何在括號(hào)中接受一個(gè)對(duì)象。相同的實(shí)例被傳入兩個(gè)不同的線程實(shí)例中。

Java的synchronized塊標(biāo)記一個(gè)方法或一個(gè)代碼塊為同步的。synchronized塊能用于防止出現(xiàn)競(jìng)態(tài)條件。

Java的synchronized關(guān)鍵字

java中的synchronized塊使用synchronized關(guān)鍵字進(jìn)行標(biāo)記。一個(gè)synchronized塊在某個(gè)對(duì)象上被同步。所有在某個(gè)對(duì)象上同步的synchronized塊同時(shí)只能有一個(gè)線程執(zhí)行,所有其他試圖進(jìn)入synchronized塊的線程被阻塞,知道進(jìn)入synchronized塊的線程退出。

synchronized關(guān)鍵字能夠用于編輯4種不同類型的塊:

實(shí)例方法

靜態(tài)方法

實(shí)例方法中的代碼塊

靜態(tài)方法中的代碼塊

這些塊被同步在不同的對(duì)象上。哪種synchronized塊是你需要的取決于實(shí)際情況。

同步的實(shí)例方法

這里有一個(gè)同步的實(shí)例方法:

public synchronized void add(int value) {
  this.count += value;
}

注意這里在方法定義中使用synchronized關(guān)鍵字。這告訴Java方法是同步的。

Java中一個(gè)同步的實(shí)例方法同步在這個(gè)方法所在的實(shí)例(對(duì)象)上。因此,每個(gè)實(shí)例的同步方法同步在不同的對(duì)象上:擁有這個(gè)方法的實(shí)例。同時(shí)只有一個(gè)線程能在一個(gè)同步的實(shí)例方法上執(zhí)行。如果多于一個(gè)實(shí)例存在,則一個(gè)線程一次能執(zhí)行在每個(gè)實(shí)例的一個(gè)同步實(shí)例方法中,每個(gè)實(shí)例一個(gè)線程。

同步的靜態(tài)方法

靜態(tài)方法被標(biāo)記為synchronized就像實(shí)例方法一樣使用synchronized關(guān)鍵字。這里有一個(gè)同步的靜態(tài)方法:

public static synchronized void add(int value) {
  count += value;
}

這里synchronized關(guān)鍵字告訴Java這個(gè)方法是同步的。

同步的靜態(tài)方法同步在方法所屬的類對(duì)象(如MyClass.class)上。由于每個(gè)類只有一個(gè)類對(duì)象存在于JVM中,因此全局同時(shí)只有一個(gè)線程能夠進(jìn)入到同一個(gè)類的靜態(tài)同步方法中。

如果靜態(tài)同步方法位于不同的類中,則一個(gè)線程能夠在每個(gè)類的靜態(tài)同步方法中執(zhí)行。每個(gè)類一個(gè)線程。

實(shí)例方法的同步代碼塊

有時(shí)不必同步整個(gè)方法。有時(shí)更傾向于只同步一個(gè)方法中的一部分。Java同步代碼塊使這種期望成為可能。

這里有一個(gè)在非同步Java方法中的同步代碼塊:

public void add(int value) {
  synchronized(this) {
    this.count += value;
  }
}

這個(gè)例子使用Java同步代碼塊使得一塊代碼可以被同步訪問。這塊代碼現(xiàn)在就好像是一個(gè)同步方法被執(zhí)行。

注意Java同步代碼塊如何在括號(hào)中接受一個(gè)對(duì)象。在上面的例子中“this”被使用,也就是這個(gè)方法調(diào)用所在的實(shí)例。括號(hào)中的對(duì)象叫做「monitor object」。這段代碼被叫做同步在一個(gè)monitor object上。一個(gè)同步的實(shí)例方法使用它所屬的對(duì)象作為monitor object。

同時(shí)只有一個(gè)線程能執(zhí)行在同步于相同monitor object上的Java代碼塊。

下面兩個(gè)例子都是同步在他們被調(diào)用的實(shí)例上,兩者等價(jià):

public class MyClass {
  public synchronized void log1(String msg1, String msg2) {
    log.writeln(msg1);
    log.writeln(msg2);
  }

  public void log2(String msg1, String msg2) {
    synchronized(this) {
      log.writeln(msg1);
      log.writeln(msg2);
    }
  }
}

同時(shí)只有一個(gè)線程能夠執(zhí)行在上面兩個(gè)同步代碼塊之一上面。

可能會(huì)有代碼塊同步在非this對(duì)象上。

靜態(tài)方法中的同步代碼塊

這些方法同步在方法所屬類的類對(duì)象上:

public class MyClass {
  public static synchronized void log1(String msg1, String msg2) {
    log.writeln(msg1);
    log.writeln(msg2);
  }

  public static void log2(String msg1, String msg2) {
    synchronized(MyClass.class) {
      log.writeln(msg1);
      log.writeln(msg2);
    }
  }
}

可能會(huì)有代碼塊同步在非MyClass.class上。

synchronized例子

這里有一個(gè)例子,啟動(dòng)2個(gè)線程,每個(gè)線程都在同一個(gè)Counter對(duì)象上調(diào)用add方法。同時(shí)只有一個(gè)線程會(huì)調(diào)用同一個(gè)對(duì)象的add方法,因?yàn)檫@個(gè)方法被synchronized關(guān)鍵字修飾在它所屬的同一個(gè)實(shí)例上。

public class Counter {
  
  long count = 0;

  public synchronized void add(long value) {
    this.count += value
  }
}
public class CounterThread extends Thread {

  protected Counter counter = null;

  public CounterThread(Counter counter) {
    this.counter = counter;
  }

  public void run() {
    for(int i = 0; i < 10; i++) {
      counter.add(i);
    }
  }
}
public class Example {

  public static void main(String[] args) {
    Counter counter = new Counter();
    Thread threadA = new CounterThread(counter);
    Thread threadB = new CounterThread(counter);
    
    threadA.start();
    threadB.start();
  }
}

兩個(gè)線程被創(chuàng)建。相同的Counter實(shí)例被傳入兩個(gè)不同的線程實(shí)例中。Counter.add()方法在實(shí)例上同步,因?yàn)閍dd方法是一個(gè)實(shí)例方法,并被標(biāo)記為synchronized。因此同時(shí)只有一個(gè)線程能調(diào)用add()方法。另一個(gè)線程會(huì)等待第一個(gè)線程離開add()方法,然后執(zhí)行。

如果兩個(gè)線程引用兩個(gè)不同的Counter實(shí)例,則同時(shí)調(diào)用add()方法不會(huì)有問題。調(diào)用是對(duì)于不同的對(duì)象,因此方法調(diào)用也同步在不同的對(duì)象上。因此調(diào)用不會(huì)被阻塞。

public class Example {

  public static void main(String[] args) {
    Counter counterA = new Counter();
    Counter counterB = new Counter();
    Thread threadA = new CounterThread(counterA);
    Thread threadB = new CounterThread(counterB);
    
    threadA.start();
    threadB.start();
  }
}

助理這里的threadA和threadB不再引用同一個(gè)counter實(shí)例。counterA和counterB的add方法同步在各自所屬對(duì)象上。調(diào)用counterA的add()方法不會(huì)紫塞調(diào)用在counterB的add()方法。

Java的同步實(shí)用工具

synchronized機(jī)制是Java的第一個(gè)用于同步訪問共享在多線程間的同步機(jī)制。synchronized機(jī)制現(xiàn)在看來不是很先進(jìn),這也就是為什么Java5推出了一組同步實(shí)用類幫助開發(fā)者實(shí)現(xiàn)更細(xì)粒度的同步控制。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75949.html

相關(guān)文章

  • Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(1)

    摘要:轉(zhuǎn)載請(qǐng)備注地址多線程學(xué)習(xí)二將分為兩篇文章介紹同步方法另一篇介紹同步語(yǔ)句塊。如果兩個(gè)線程同時(shí)操作對(duì)象中的實(shí)例變量,則會(huì)出現(xiàn)非線程安全,解決辦法就是在方法前加上關(guān)鍵字即可。 轉(zhuǎn)載請(qǐng)備注地址: https://blog.csdn.net/qq_3433... Java多線程學(xué)習(xí)(二)將分為兩篇文章介紹synchronized同步方法另一篇介紹synchronized同步語(yǔ)句塊。系列文章傳送門...

    xuxueli 評(píng)論0 收藏0
  • Java同步塊簡(jiǎn)介

    摘要:同步塊用來避免競(jìng)爭(zhēng)。實(shí)際需要那種同步塊視具體情況而定。在非同步的方法中的同步塊的例子如下所示示例使用同步塊構(gòu)造器來標(biāo)記一塊代碼是同步的。在同步構(gòu)造器中用括號(hào)括起來的對(duì)象叫做監(jiān)視器對(duì)象。他們的構(gòu)造器引用同一個(gè)實(shí)例。 Java 同步塊(synchronized block)用來標(biāo)記方法或者代碼塊是同步的。Java同步塊用來避免競(jìng)爭(zhēng)。本文介紹以下內(nèi)容: Java同步關(guān)鍵字(synchro...

    warnerwu 評(píng)論0 收藏0
  • Java 中的 Monitor 機(jī)制

    摘要:基本元素機(jī)制需要幾個(gè)元素來配合,分別是臨界區(qū)對(duì)象及鎖條件變量以及定義在對(duì)象上的,操作。這個(gè)外部條件在機(jī)制中稱為條件變量。提供的機(jī)制,其實(shí)是,等元素合作形成的,甚至說外部的條件變量也是個(gè)組成部分。 monitor的概念 管程,英文是 Monitor,也常被翻譯為監(jiān)視器,monitor 不管是翻譯為管程還是監(jiān)視器,都是比較晦澀的,通過翻譯后的中文,并無法對(duì) monitor 達(dá)到一個(gè)直觀的描...

    Jacendfeng 評(píng)論0 收藏0
  • Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(2)

    摘要:關(guān)鍵字加到非靜態(tài)方法上持有的是對(duì)象鎖。線程和線程持有的鎖不一樣,所以和運(yùn)行同步,但是和運(yùn)行不同步。所以盡量不要使用而使用參考多線程編程核心技術(shù)并發(fā)編程的藝術(shù)如果你覺得博主的文章不錯(cuò),歡迎轉(zhuǎn)發(fā)點(diǎn)贊。 系列文章傳送門: Java多線程學(xué)習(xí)(一)Java多線程入門 Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(2) J...

    Batkid 評(píng)論0 收藏0
  • Java 多線程核心技術(shù)梳理(附源碼)

    摘要:本文對(duì)多線程基礎(chǔ)知識(shí)進(jìn)行梳理,主要包括多線程的基本使用,對(duì)象及變量的并發(fā)訪問,線程間通信,的使用,定時(shí)器,單例模式,以及線程狀態(tài)與線程組。源碼采用構(gòu)建,多線程這部分源碼位于模塊中。通知可能等待該對(duì)象的對(duì)象鎖的其他線程。 本文對(duì)多線程基礎(chǔ)知識(shí)進(jìn)行梳理,主要包括多線程的基本使用,對(duì)象及變量的并發(fā)訪問,線程間通信,lock的使用,定時(shí)器,單例模式,以及線程狀態(tài)與線程組。 寫在前面 花了一周時(shí)...

    Winer 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<