日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java 代码同步_Java同步代码块 转

發(fā)布時(shí)間:2023/12/4 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 代码同步_Java同步代码块 转 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java 同步塊(synchronized block)用來標(biāo)記方法或者代碼塊是同步的。Java同步塊用來避免競(jìng)爭(zhēng)。本文介紹以下內(nèi)容:

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

實(shí)例方法同步

靜態(tài)方法同步

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

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

Java同步示例

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

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

有四種不同的同步塊:

實(shí)例方法

靜態(tài)方法

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

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

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

實(shí)例方法同步

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

1 public synchronized void add(intvalue){2   this.count +=value;3 }

注意在方法聲明中同步(synchronized?)關(guān)鍵字。這告訴Java該方法是同步的。

Java實(shí)例方法同步是同步在擁有該方法的對(duì)象上。這樣,每個(gè)實(shí)例其方法同步都同步在不同的對(duì)象上,即該方法所屬的實(shí)例。只有一個(gè)線程能夠在實(shí)例方法同步塊中運(yùn)行。如果有多個(gè)實(shí)例存在,那么一個(gè)線程一次可以在一個(gè)實(shí)例同步塊中執(zhí)行操作。一個(gè)實(shí)例一個(gè)線程。

靜態(tài)方法同步

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

1 public static synchronized void add(intvalue){2 count +=value;3 }

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

靜態(tài)方法的同步是指同步在該方法所在的類對(duì)象上。因?yàn)樵贘ava虛擬機(jī)中一個(gè)類只能對(duì)應(yīng)一個(gè)類對(duì)象,所以同時(shí)只允許一個(gè)線程執(zhí)行同一個(gè)類中的靜態(tài)同步方法。

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

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

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

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

1 public void add(intvalue){2

3 synchronized(this){4 this.count +=value;5 }6 }

示例使用Java同步塊構(gòu)造器來標(biāo)記一塊代碼是同步的。該代碼在執(zhí)行時(shí)和同步方法一樣。

注意Java同步塊構(gòu)造器用括號(hào)將對(duì)象括起來。在上例中,使用了“this”,即為調(diào)用add方法的實(shí)例本身。在同步構(gòu)造器中用括號(hào)括起來的對(duì)象叫做監(jiān)視器對(duì)象。上述代碼使用監(jiān)視器對(duì)象同步,同步實(shí)例方法使用調(diào)用方法本身的實(shí)例作為監(jiān)視器對(duì)象。

一次只有一個(gè)線程能夠在同步于同一個(gè)監(jiān)視器對(duì)象的Java方法內(nèi)執(zhí)行。

下面兩個(gè)例子都同步他們所調(diào)用的實(shí)例對(duì)象上,因此他們?cè)谕降膱?zhí)行效果上是等效的。

1 public classMyClass {2

3 public synchronized voidlog1(String msg1, String msg2){4 log.writeln(msg1);5 log.writeln(msg2);6 }7

8 public voidlog2(String msg1, String msg2){9 synchronized(this){10 log.writeln(msg1);11 log.writeln(msg2);12 }13 }14 }

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

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

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

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

1 public classMyClass {2 public static synchronized voidlog1(String msg1, String msg2){3 log.writeln(msg1);4 log.writeln(msg2);5 }6

7 public static voidlog2(String msg1, String msg2){8 synchronized(MyClass.class){9 log.writeln(msg1);10 log.writeln(msg2);11 }12 }13 }

這兩個(gè)方法不允許同時(shí)被線程訪問。

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

Java同步實(shí)例

在下面例子中,啟動(dòng)了兩個(gè)線程,都調(diào)用Counter類同一個(gè)實(shí)例的add方法。因?yàn)橥皆谠摲椒ㄋ鶎俚膶?shí)例上,所以同時(shí)只能有一個(gè)線程訪問該方法。

1 public classCounter{2 long count = 0;3 public synchronized void add(longvalue){4 this.count +=value;5 }6 }7

8 public class CounterThread extendsThread{9 protected Counter counter = null;10

11 publicCounterThread(Counter counter){12 this.counter =counter;13 }14

15 public voidrun() {16 for(int i=0; i<10; i++){17 counter.add(i);18 }19 }20 }21

22 public classExample {23

24 public static voidmain(String[] args){25 Counter counter = newCounter();26 Thread threadA = newCounterThread(counter);27 Thread threadB = newCounterThread(counter);28

29 threadA.start();30 threadB.start();31 }32 }

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

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

1 public classExample {2

3 public static voidmain(String[] args){4 Counter counterA = newCounter();5 Counter counterB = newCounter();6 Thread threadA = newCounterThread(counterA);7 Thread threadB = newCounterThread(counterB);8

9 threadA.start();10 threadB.start();11 }12 }

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

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的java 代码同步_Java同步代码块 转的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。