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

Java線程同步Lock同步鎖代碼示例

 更新時間:2017年11月14日 09:03:40   作者:超超boy  
這篇文章主要介紹了Java線程同步Lock同步鎖代碼示例,首先介紹了Java線程同步的原理,然后對lock同步鎖作了簡要闡述,分享了代碼示例,具有一定參考價值,需要的朋友可以了解下。

java線程同步原理

java會為每個object對象分配一個monitor,當某個對象的同步方法(synchronizedmethods)被多個線程調(diào)用時,該對象的monitor將負責處理這些訪問的并發(fā)獨占要求。

當一個線程調(diào)用一個對象的同步方法時,JVM會檢查該對象的monitor。如果monitor沒有被占用,那么這個線程就得到了monitor的占有權(quán),可以繼續(xù)執(zhí)行該對象的同步方法;如果monitor被其他線程所占用,那么該線程將被掛起,直到monitor被釋放。

當線程退出同步方法調(diào)用時,該線程會釋放monitor,這將允許其他等待的線程獲得monitor以使對同步方法的調(diào)用執(zhí)行下去。

注意:Java對象的monitor機制和傳統(tǒng)的臨界檢查代碼區(qū)技術(shù)不一樣。java的一個同步方法并不意味著同時只有一個線程獨占執(zhí)行,但臨界檢查代碼區(qū)技術(shù)確實會保證同步方法在一個時刻只被一個線程獨占執(zhí)行。Java的monitor機制的準確含義是:任何時刻,對一個指定object對象的某同步方法只能由一個線程來調(diào)用。

java對象的monitor是跟隨object實例來使用的,而不是跟隨程序代碼。兩個線程可以同時執(zhí)行相同的同步方法,比如:一個類的同步方法是xMethod(),有a,b兩個對象實例,一個線程執(zhí)行a.xMethod(),另一個線程執(zhí)行b.xMethod().互不沖突。

Lock-同步鎖

Lock是java5提供的一個強大的線程同步機制--通過顯示定義同步鎖對象來實現(xiàn)同步。Lock可以顯示的加鎖、解鎖。每次只能有一個線程對lock對象加鎖。

Lock有ReadLock、WriteLock、ReentrantLock(可重入鎖)

常用的就是ReentrantLock。代碼如下:

代碼邏輯:Account賬戶類,實現(xiàn)取錢的同步方法、DrawThread取錢的線程

Account:

package lock.reentrantlock2;
import java.util.concurrent.locks.*;
/**
 *賬戶類,需保持同步
 */
public class Account
{
  //定義鎖對象
  private final ReentrantLock lock = new ReentrantLock();
  private String accountNo;
  private double balance;
  public Account(){}
  public Account(String accountNo , double balance)
  {
    this.accountNo = accountNo;
    this.balance = balance;
  }
  public void setAccountNo(String accountNo)
  {
    this.accountNo = accountNo;
  }
  public String getAccountNo()
  {
     return this.accountNo;
  }
  public double getBalance()
  {
     return this.balance;
  }
  public void draw(double drawAmount)
  {
    lock.lock();
    try
    {
      //賬戶余額大于取錢數(shù)目
      if (balance >= drawAmount)
      {
        //吐出鈔票
        System.out.println(Thread.currentThread().getName() +
          "取錢成功!吐出鈔票:" + drawAmount);
        try
        {
          Thread.sleep(1);      
        }
        catch (InterruptedException ex)
        {
          ex.printStackTrace();
        }
        //修改余額
        balance -= drawAmount;
        System.out.println("\t余額為: " + balance);
      }
      else
      {
        System.out.println(Thread.currentThread().getName() +
          "取錢失??!余額不足!");
      }     
    }
    finally
    {
      lock.unlock();
    }
  }
  public int hashCode()
  {
    return accountNo.hashCode();
  }
  public boolean equals(Object obj)
  {
    if (obj != null && obj.getClass() == Account.class)
    {
      Account target = (Account)obj;
      return target.getAccountNo().equals(accountNo);
    }
    return false;
  }
}

DrawThread:

package lock.reentrantlock2;
/**
 * 調(diào)用account取錢
 *
 */
public class DrawThread extends Thread
{
  //模擬用戶賬戶
  private Account account;
  //當前取錢線程所希望取的錢數(shù)
  private double drawAmount;
  public DrawThread(String name , Account account ,
    double drawAmount)
  {
    super(name);
    this.account = account;
    this.drawAmount = drawAmount;
  }
  //當多條線程修改同一個共享數(shù)據(jù)時,將涉及到數(shù)據(jù)安全問題。
  public void run()
  {
    account.draw(drawAmount);
  }
}

TestDraw:

package lock.reentrantlock2;
/**
 */
public class TestDraw
{
  public static void main(String[] args)
  {
    //創(chuàng)建一個賬戶
    Account acct = new Account("1234567" , 1000);
    //模擬兩個線程對同一個賬戶取錢
    new DrawThread("甲" , acct , 800).start();
    new DrawThread("乙" , acct , 800).start();
  }
}

運行結(jié)果:

甲取錢成功!吐出鈔票:800.0 
余額為:200.0 
乙取錢失?。∮囝~不足! 

使用Lock同步與同步方法很相似,都是“加鎖--修改公共變量--釋放鎖”的模式,代碼很容易看懂。兩個線程對應(yīng)一個Account對象,保證了兩個線程對應(yīng)一個lock對象,保證了同一時刻只有一個線程進入臨界區(qū)。Lock還包含太容易Lock(),以及試圖獲取可中斷鎖的lockInterruptibly(),獲取超時失效鎖的tryLock(long,TimeUnit)等方法。

ReentrantLock鎖具有可重入性可以對已被加鎖的ReentrantLock鎖再次加鎖,線程每次調(diào)用lock()加鎖后,必須顯示的調(diào)用unlock來釋放鎖,有幾個lock就對應(yīng)幾個unlock。還有把unlock放在finally代碼塊中,Lock在發(fā)生異常時也是不釋放鎖的,所以在finally中釋放更安全。

總結(jié)

以上就是本文關(guān)于Java線程同步Lock同步鎖代碼示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

創(chuàng)建并運行一個java線程方法介紹

Java編程之多線程死鎖與線程間通信簡單實現(xiàn)代碼

Java多線程編程小實例模擬停車場系統(tǒng)

有什么問題可以隨時留言,小編會及時回復大家的。感謝朋友們對本站的支持!

相關(guān)文章

  • java17日期周期格式化處理方案

    java17日期周期格式化處理方案

    Java17引入了新的日期時間格式化模式B,用于表示一天中的時間段,如上午、下午、晚上等,該模式根據(jù)CLDR定義,在不同語言環(huán)境下,該模式的輸出結(jié)果會有所不同,本文給大家介紹java17日期周期格式化處理方案,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • 使用Java讀取Word文件的簡單例子分享

    使用Java讀取Word文件的簡單例子分享

    這篇文章主要介紹了使用Java讀取Word文件的簡單例子分享,包括讀取word文件的表格數(shù)據(jù)的示例,需要的朋友可以參考下
    2015-10-10
  • 基于SpringBoot?Mock單元測試詳解

    基于SpringBoot?Mock單元測試詳解

    這篇文章主要介紹了基于SpringBoot?Mock單元測試詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java輸入數(shù)據(jù)的知識點整理

    Java輸入數(shù)據(jù)的知識點整理

    在本篇文章里小編給大家整理的是關(guān)于Java如何輸入數(shù)據(jù)的相關(guān)知識點內(nèi)容,有興趣的朋友們學習參考下。
    2020-01-01
  • Java基礎(chǔ)之刪除文本文件中特定行的內(nèi)容

    Java基礎(chǔ)之刪除文本文件中特定行的內(nèi)容

    這篇文章主要介紹了Java基礎(chǔ)之刪除文本文件中特定行的內(nèi)容,文中有非常詳細的代碼示例,對正在學習java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • spring boot2結(jié)合mybatis增刪改查的實現(xiàn)

    spring boot2結(jié)合mybatis增刪改查的實現(xiàn)

    這篇文章主要給大家介紹了關(guān)于spring boot2結(jié)合mybatis增刪改查的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot2具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • JVM:你知道為什么對象一定在堆中分配嗎

    JVM:你知道為什么對象一定在堆中分配嗎

    這篇文章主要介紹了jvm對象的創(chuàng)建和分配的相關(guān)資料,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-08-08
  • Java MongoDB數(shù)據(jù)庫連接方法梳理

    Java MongoDB數(shù)據(jù)庫連接方法梳理

    MongoDB作為一種介于關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫之間的產(chǎn)品,它可以提供可擴展的高性能的數(shù)據(jù)存儲解決方案,近些年來受到了開發(fā)者的喜愛
    2022-08-08
  • SpringBoot如何啟動自動加載自定義模塊yml文件(PropertySourceFactory)

    SpringBoot如何啟動自動加載自定義模塊yml文件(PropertySourceFactory)

    這篇文章主要介紹了SpringBoot如何啟動自動加載自定義模塊yml文件(PropertySourceFactory),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 關(guān)于@Value注解取不到值的幾種情況

    關(guān)于@Value注解取不到值的幾種情況

    這篇文章主要介紹了關(guān)于@Value注解取不到值的幾種情況,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

尼勒克县| 出国| 邹城市| 长治县| 九龙坡区| 门头沟区| 池州市| 沽源县| 金乡县| 邹城市| 仪征市| 嘉鱼县| 修文县| 巴青县| 邳州市| 舞钢市| 澄江县| 凤翔县| 苗栗市| 斗六市| 新化县| 娄底市| 朔州市| 景东| 宽城| 枝江市| 孝昌县| 花莲市| 文登市| 安达市| 高清| 永顺县| 九龙城区| 门头沟区| 通江县| 神农架林区| 武隆县| 随州市| 车致| 颍上县| 密山市|