激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

服務器之家 - 編程語言 - JAVA教程 - java多線程-同步塊實例講解

java多線程-同步塊實例講解

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

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

java多線程-同步塊

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

  1. Java 同步關鍵字(synchronzied)
  2. 實例方法同步
  3. 靜態方法同步
  4. 實例方法中同步塊
  5. 靜態方法中同步塊
  6. Java 同步示例

Java 同步關鍵字(synchronized)

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

有四種不同的同步塊:

  1. 實例方法
  2. 靜態方法
  3. 實例方法中的同步塊
  4. 靜態方法中的同步塊
  5.  

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

實例方法同步

下面是一個同步的實例方法:

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

靜態方法同步

靜態方法同步和實例方法同步方法一樣,也使用 synchronized 關鍵字。Java 靜態方法同步如下示例:

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

同樣,這里 synchronized 關鍵字告訴 Java 這個方法是同步的。

靜態方法的同步是指同步在該方法所在的類對象上。因為在 Java 虛擬機中一個類只能對應一個類對象,所以同時只允許一個線程執行同一個類中的靜態同步方法。

對于不同類中的靜態同步方法,一個線程可以執行每個類中的靜態同步方法而無需等待。不管類中的那個靜態同步方法被調用,一個類只能由一個線程同時執行。

實例方法中的同步塊

有時你不需要同步整個方法,而是同步方法中的一部分。Java 可以對方法的一部分進行同步。

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

?
1
2
3
4
5
6
public void add(int value){
 
 synchronized(this){
  this.count += value;
 }
 }

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

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

一次只有一個線程能夠在同步于同一個監視器對象的 Java 方法內執行。

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

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

在上例中,每次只有一個線程能夠在兩個同步塊中任意一個方法內執行。

如果第二個同步塊不是同步在 this 實例對象上,那么兩個方法可以被線程同時執行。

靜態方法中的同步塊

和上面類似,下面是兩個靜態方法同步的例子。這些方法同步在該方法所屬的類對象上。

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

這兩個方法不允許同時被線程訪問。

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

Java 同步實例

在下面例子中,啟動了兩個線程,都調用 Counter 類同一個實例的 add 方法。因為同步在該方法所屬的實例上,所以同時只能有一個線程訪問該方法。

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

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

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

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

注意這兩個線程,threadA 和 threadB,不再引用同一個 counter 實例。CounterA 和 counterB 的 add 方法同步在他們所屬的對象上。調用 counterA 的 add 方法將不會阻塞調用 counterB 的 add 方法。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲特黄 | 色污视频在线观看 | 91精品国产综合久久婷婷香蕉 | 成片免费大全 | 男女无遮挡羞羞视频 | 久久精品影视 | 欧美色淫 | 国产一区二区三区高清 | 久久久国产一级片 | av免费在线网 | 极品五月天 | 国产免费最爽的乱淫视频a 午夜精品久久久久久久99热浪潮 | 网站毛片| 中文字幕国产日韩 | 国产成人高清在线观看 | 久久精品视频在线看99 | 在线观看精品视频 | 九一成人 | 欧美日韩免费看 | 亚洲一级簧片 | 看免费的毛片 | 在线天堂中文在线资源网 | 多男操一女视频 | 欧美一区二区三区中文字幕 | 青青草在线免费观看 | 久久久入口 | 欧美黄 片免费观看 | 久久999精品 | 免费观看欧美一级片 | 国产一区二区三区视频在线观看 | 亚洲αv| 国产老师做www爽爽爽视频 | 草草视频免费 | 欧美日韩亚洲视频 | 4p嗯啊巨肉寝室调教男男视频 | 日韩黄色免费电影 | 黄视频网站免费 | 成人一级黄色片 | 欧美黑大粗硬毛片视频 | 欧美一级电影网站 | 精品一区视频 |