最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年09月04日 08:58:58   作者:DemonWang  
本文主要介紹java多線程-同步塊的知識,這里整理了相關(guān)的詳細(xì)資料及簡單示例代碼,有興趣的小伙伴可以參考下

java多線程-同步塊

Java 同步塊(synchronized block)用來標(biāo)記方法或者代碼塊是同步的。Java 同步塊用來避免競爭。本文介紹以下內(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è)對象上。所有同步在一個(gè)對象上的同步塊在同時(shí)只能被一個(gè)線程進(jìn)入并執(zhí)行操作。所有其他等待進(jìn)入該同步塊的線程將被阻塞,直到執(zhí)行該同步塊中的線程退出。

有四種不同的同步塊:

  1. 實(shí)例方法
  2. 靜態(tài)方法
  3. 實(shí)例方法中的同步塊
  4. 靜態(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)方法的同步是指同步在該方法所在的類對象上。因?yàn)樵?Java 虛擬機(jī)中一個(gè)類只能對應(yīng)一個(gè)類對象,所以同時(shí)只允許一個(gè)線程執(zhí)行同一個(gè)類中的靜態(tài)同步方法。

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

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

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

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

public void add(int value){

 synchronized(this){
  this.count += value;
 }
 }

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

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

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

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

 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í)例對象上,那么兩個(gè)方法可以被線程同時(shí)執(zhí)行。

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

和上面類似,下面是兩個(gè)靜態(tà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í)被線程訪問。

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

Java 同步實(shí)例

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

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)用了不同的對象,因此這些方法也就同步在不同的對象上。這些方法調(diào)用將不會被阻塞。如下面這個(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è)線程,threadA 和 threadB,不再引用同一個(gè) counter 實(shí)例。CounterA 和 counterB 的 add 方法同步在他們所屬的對象上。調(diào)用 counterA 的 add 方法將不會阻塞調(diào)用 counterB 的 add 方法。

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

相關(guān)文章

  • 從零開始Java實(shí)現(xiàn)Parser?Combinator

    從零開始Java實(shí)現(xiàn)Parser?Combinator

    這篇文章主要為大家介紹了從零開始Java實(shí)現(xiàn)Parser?Combinator過程及原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 基于RabbitMQ的簡單應(yīng)用(詳解)

    基于RabbitMQ的簡單應(yīng)用(詳解)

    下面小編就為大家分享一篇基于RabbitMQ的簡單應(yīng)用(詳解),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • springboot整合shiro登錄失敗次數(shù)限制功能的實(shí)現(xiàn)代碼

    springboot整合shiro登錄失敗次數(shù)限制功能的實(shí)現(xiàn)代碼

    這篇文章主要介紹了springboot整合shiro-登錄失敗次數(shù)限制功能,實(shí)現(xiàn)此功能如果是防止壞人多次嘗試,破解密碼的情況,所以要限制用戶登錄嘗試次數(shù),需要的朋友可以參考下
    2018-09-09
  • Spring AOP結(jié)合注解實(shí)現(xiàn)接口層操作日志記錄

    Spring AOP結(jié)合注解實(shí)現(xiàn)接口層操作日志記錄

    在項(xiàng)目開發(fā)中我們需要記錄接口的操作日志:包含請求參數(shù)、響應(yīng)參數(shù)、接口所屬模塊、接口功能描述、請求地址、ip地址等信息;實(shí)現(xiàn)思路很簡單就是基于注解和aop的方式去記錄日志,主要的難點(diǎn)在于日志表結(jié)構(gòu)、注解的設(shè)計(jì)已經(jīng)aop實(shí)現(xiàn)的一些比較好的實(shí)現(xiàn)方式的借鑒
    2022-08-08
  • 基于JDBC封裝的BaseDao(實(shí)例代碼)

    基于JDBC封裝的BaseDao(實(shí)例代碼)

    下面小編就為大家?guī)硪黄贘DBC封裝的BaseDao(實(shí)例代碼)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • 解決java.sql.SQLException:索引中丟失 IN或OUT 參數(shù)::x問題

    解決java.sql.SQLException:索引中丟失 IN或OUT 參數(shù)::x問題

    這篇文章主要介紹了解決java.sql.SQLException:索引中丟失 IN或OUT 參數(shù)::x問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java 異步實(shí)現(xiàn)的幾種方式小結(jié)

    Java 異步實(shí)現(xiàn)的幾種方式小結(jié)

    這篇文章主要介紹了Java 異步實(shí)現(xiàn)的幾種方式小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot如何通過Map實(shí)現(xiàn)策略模式

    SpringBoot如何通過Map實(shí)現(xiàn)策略模式

    策略模式是一種行為設(shè)計(jì)模式,它允許在運(yùn)行時(shí)選擇算法的行為,在Spring框架中,我們可以利用@Resource注解和Map集合來優(yōu)雅地實(shí)現(xiàn)策略模式,這篇文章主要介紹了SpringBoot如何通過Map實(shí)現(xiàn)策略模式,需要的朋友可以參考下
    2025-03-03
  • java編程簡單獲取圖片像素的方法

    java編程簡單獲取圖片像素的方法

    這篇文章主要介紹了java編程簡單獲取圖片像素的方法,涉及Java針對圖片的讀取與屬性獲取技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Java利用線程工廠監(jiān)控線程池的實(shí)現(xiàn)示例

    Java利用線程工廠監(jiān)控線程池的實(shí)現(xiàn)示例

    這篇文章主要介紹了Java利用線程工廠監(jiān)控線程池的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

翁牛特旗| 永昌县| 洛隆县| 龙海市| 七台河市| 武威市| 金昌市| 镇平县| 武乡县| 宁陕县| 乌恰县| 石楼县| 固镇县| 漾濞| 龙海市| 佛冈县| 乌鲁木齐市| 岫岩| 老河口市| 肃南| 定边县| 鞍山市| 金沙县| 罗城| 黄大仙区| 亳州市| 松滋市| 南城县| 邵武市| 芮城县| 鄂尔多斯市| 遂川县| 云霄县| 巴彦县| 密山市| 吴江市| 诸暨市| 宝山区| 满洲里市| 青川县| 资兴市|