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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - java多線程-同步塊實(shí)例講解

java多線程-同步塊實(shí)例講解

2020-06-10 11:25DemonWang JAVA教程

本文主要介紹java多線程-同步塊的知識(shí),這里整理了相關(guān)的詳細(xì)資料及簡(jiǎn)單示例代碼,有興趣的小伙伴可以參考下

java多線程-同步塊

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

  1. Java 同步關(guān)鍵字(synchronzied)
  2. 實(shí)例方法同步
  3. 靜態(tài)方法同步
  4. 實(shí)例方法中同步塊
  5. 靜態(tài)方法中同步塊
  6. Java 同步示例

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

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

有四種不同的同步塊:

  1. 實(shí)例方法
  2. 靜態(tài)方法
  3. 實(shí)例方法中的同步塊
  4. 靜態(tài)方法中的同步塊
  5.  

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

實(shí)例方法同步

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

?
1
2
3
public synchronized void add(int value){
this.count += value;
 }<br>

靜態(tài)方法同步

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

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

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

靜態(tài)方法的同步是指同步在該方法所在的類對(duì)象上。因?yàn)樵?Java 虛擬機(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
2
3
4
5
6
public void add(int value){
 
 synchronized(this){
  this.count += value;
 }
 }

示例使用 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
2
3
4
5
6
7
8
9
10
11
12
13
14
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è)線程能夠在兩個(gè)同步塊中任意一個(gè)方法內(nèi)執(zhí)行。

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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í)被線程訪問。

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

Java 同步實(shí)例

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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è)線程。他們的構(gòu)造器引用同一個(gè) Counter 實(shí)例。Counter.add 方法是同步在實(shí)例上,是因?yàn)?add 方法是實(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
2
3
4
5
6
7
8
9
10
11
12
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è)線程,threadA 和 threadB,不再引用同一個(gè) counter 實(shí)例。CounterA 和 counterB 的 add 方法同步在他們所屬的對(duì)象上。調(diào)用 counterA 的 add 方法將不會(huì)阻塞調(diào)用 counterB 的 add 方法。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: bl双性肉文| 蜜柚精彩在线观看 | 日韩成人精品 | 亚洲精品第五页中文字幕 | 18性夜影院午夜寂寞影院免费 | 国内精品久久久久久久久 | 国色天香社区视频免费观看3 | 国产成人精品午夜免费 | 男人j放进女人的p免费看视频 | 2018亚洲男人天堂 | 91视频夜色 | 99久久免费精品视频 | 欧美激情亚洲 | 成人伊人亚洲人综合网站222 | 黑人巨大初黑人解禁作品 | 日日艹 | 成人免费观看www视频 | 国产码一区二区三区 | 免费在线观看网址入口 | 日韩高清在线免费看 | 被强迫调教的高辣小说 | 97精品国产高清在线看入口 | tube69中国露脸 | 精品国产乱码久久久人妻 | 欧美透逼视频 | 刺激一区仑乱 | 国产精品久久香蕉免费播放 | 色男人的天堂久久综合 | 天选之王漫画顾长歌免费阅读 | 成人操 | 日本高清在线播放一区二区三区 | 久久综合给合久久狠狠狠… | 范冰冰a级一级特级毛片 | 王雨纯 羞羞 | 99re这里只有精品视频在线观看 | 99久久国语露脸精品国产 | 国产成人h综合亚洲欧美在线 | 99久久精品免费看国产四区 | 免费看美女被靠到爽 | 亚洲天堂色视频 | 色综合天天综合网看在线影院 |