一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

java語(yǔ)言

java多線(xiàn)程同步塊實(shí)例講解素材

時(shí)間:2025-03-03 11:53:32 java語(yǔ)言 我要投稿
  • 相關(guān)推薦

java多線(xiàn)程同步塊實(shí)例講解素材

  Java 同步塊(synchronized block)用來(lái)標記方法或者代碼塊是同步的。Java 同步塊用來(lái)避免競爭。本文介紹以下內容:

  Java 同步關(guān)鍵字(synchronzied) 實(shí)例方法同步 靜態(tài)方法同步 實(shí)例方法中同步塊 靜態(tài)方法中同步塊 Java 同步示例

  Java 同步關(guān)鍵字(synchronized)

  Java 中的同步塊用 synchronized 標記。同步塊在 Java 中是同步在某個(gè)對象上。所有同步在一個(gè)對象上的同步塊在同時(shí)只能被一個(gè)線(xiàn)程進(jìn)入并執行操作。所有其他等待進(jìn)入該同步塊的線(xiàn)程將被阻塞,直到執行該同步塊中的線(xiàn)程退出。

  有四種不同的同步塊:

  實(shí)例方法 靜態(tài)方法 實(shí)例方法中的同步塊 靜態(tài)方法中的同步塊

  上述同步塊都同步在不同對象上。實(shí)際需要那種同步塊視具體情況而定。

  實(shí)例方法同步

  下面是一個(gè)同步的實(shí)例方法:

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

  靜態(tài)方法同步

  靜態(tài)方法同步和實(shí)例方法同步方法一樣,也使用 synchronized 關(guān)鍵字。Java 靜態(tài)方法同步如下示例:

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

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

  靜態(tài)方法的同步是指同步在該方法所在的類(lèi)對象上。因為在 Java 虛擬機中一個(gè)類(lèi)只能對應一個(gè)類(lèi)對象,所以同時(shí)只允許一個(gè)線(xiàn)程執行同一個(gè)類(lèi)中的靜態(tài)同步方法。

  對于不同類(lèi)中的靜態(tài)同步方法,一個(gè)線(xiàn)程可以執行每個(gè)類(lèi)中的靜態(tài)同步方法而無(wú)需等待。不管類(lèi)中的那個(gè)靜態(tài)同步方法被調用,一個(gè)類(lèi)只能由一個(gè)線(xiàn)程同時(shí)執行。

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

  有時(shí)你不需要同步整個(gè)方法,而是同步方法中的一部分。Java 可以對方法的一部分進(jìn)行同步。

  在非同步的 Java 方法中的同步塊的例子如下所示:

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

  示例使用 Java 同步塊構造器來(lái)標記一塊代碼是同步的。該代碼在執行時(shí)和同步方法一樣。

  注意 Java 同步塊構造器用括號將對象括起來(lái)。在上例中,使用了“this”,即為調用 add 方法的實(shí)例本身。在同步構造器中用括號括起來(lái)的對象叫做監視器對象。上述代碼使用監視器對象同步,同步實(shí)例方法使用調用方法本身的實(shí)例作為監視器對象。

  一次只有一個(gè)線(xiàn)程能夠在同步于同一個(gè)監視器對象的 Java 方法內執行。

  下面兩個(gè)例子都同步他們所調用的實(shí)例對象上,因此他們在同步的執行效果上是等效的。

  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); } } }

  在上例中,每次只有一個(gè)線(xiàn)程能夠在兩個(gè)同步塊中任意一個(gè)方法內執行。

  如果第二個(gè)同步塊不是同步在 this 實(shí)例對象上,那么兩個(gè)方法可以被線(xiàn)程同時(shí)執行。

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

  和上面類(lèi)似,下面是兩個(gè)靜態(tài)方法同步的例子。這些方法同步在該方法所屬的類(lèi)對象上。

  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); } } }

  這兩個(gè)方法不允許同時(shí)被線(xiàn)程訪(fǎng)問(wèn)。

  如果第二個(gè)同步塊不是同步在 MyClass.class 這個(gè)對象上。那么這兩個(gè)方法可以同時(shí)被線(xiàn)程訪(fǎng)問(wèn)。

  Java 同步實(shí)例

  在下面例子中,啟動(dòng)了兩個(gè)線(xiàn)程,都調用 Counter 類(lèi)同一個(gè)實(shí)例的 add 方法。因為同步在該方法所屬的實(shí)例上,所以同時(shí)只能有一個(gè)線(xiàn)程訪(fǎng)問(wèn)該方法。

  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(); } }

  創(chuàng )建了兩個(gè)線(xiàn)程。他們的構造器引用同一個(gè) Counter 實(shí)例。Counter.add 方法是同步在實(shí)例上,是因為 add 方法是實(shí)例方法并且被標記上 synchronized 關(guān)鍵字。因此每次只允許一個(gè)線(xiàn)程調用該方法。另外一個(gè)線(xiàn)程必須要等到第一個(gè)線(xiàn)程退出 add()方法時(shí),才能繼續執行方法。

  如果兩個(gè)線(xiàn)程引用了兩個(gè)不同的 Counter 實(shí)例,那么他們可以同時(shí)調用 add()方法。這些方法調用了不同的對象,因此這些方法也就同步在不同的對象上。這些方法調用將不會(huì )被阻塞。如下面這個(gè)例子所示:

  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(); } }

  注意這兩個(gè)線(xiàn)程,threadA 和 threadB,不再引用同一個(gè) counter 實(shí)例。CounterA 和 counterB 的 add 方法同步在他們所屬的對象上。調用 counterA 的 add 方法將不會(huì )阻塞調用 counterB 的 add 方法。

  以上就是對Java 多線(xiàn)程同步塊的知識講解,后續繼續補充相關(guān)資料,謝謝大家對本站的支持!

【java多線(xiàn)程同步塊實(shí)例講解素材】相關(guān)文章:

java多線(xiàn)程的同步和異步09-05

舉例講解Java中的多線(xiàn)程范文欣賞06-16

java多線(xiàn)程-線(xiàn)程通信實(shí)例詳細解讀07-07

java的多線(xiàn)程09-09

java多線(xiàn)程08-31

java語(yǔ)言的多線(xiàn)程08-29

java多線(xiàn)程介紹08-23

java多線(xiàn)程教程11-03

Linux系統中使用數據備份同步工具Rsync的實(shí)例講解06-04

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看