中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Java項目中如何實現一個同步鎖

發布時間:2020-11-12 16:18:34 來源:億速云 閱讀:168 作者:Leah 欄目:編程語言

在Java項目中如何實現一個同步鎖?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

Java 同步鎖(synchronized)詳解及實例

Java中cpu分給每個線程的時間片是隨機的并且在Java中好多都是多個線程共用一個資源,比如火車賣票,火車票是一定的,但賣火車票的窗口到處都有,每個窗口就相當于一個線程,這么多的線程共用所有的火車票這個資源。如果在一個時間點上,兩個線程同時使用這個資源,那他們取出的火車票是一樣的(座位號一樣),這樣就會給乘客造成麻煩。比如下面程序:

package com.pakage.ThreadAndRunnable; 
 
public class Runnable_demo implements Runnable{ 
  private int ticket=10; 
  public Runnable_demo(){    
  } 
  @Override 
  public void run() { 
    for(int i=0;i<20;i++){ 
        if(this.ticket>0){ 
          //休眠1s秒中,為了使效果更明顯,否則可能出不了效果 
          try { 
            Thread.sleep(1000); 
          } catch (Exception e) { 
            e.printStackTrace(); 
          } 
          System.out.println(Thread.currentThread().getName()+"號窗口賣出:"+this.ticket--+"號票"); 
        } 
       
    } 
  } 
   
   public static void main(String args[]){ 
     Runnable_demo demo=new Runnable_demo(); 
     //基于火車票創建三個窗口 
     new Thread(demo,"a").start(); 
     new Thread(demo,"b").start(); 
     new Thread(demo,"c").start(); 
   } 
   
} 

程序運行結果:

在Java項目中如何實現一個同步鎖

我們可以看到c號窗口和和b號窗口都賣出了10號票,并且a號和b號窗口分別賣出了0號和-1號票。造成這種情況的原因是1、c線程和b線程在ticket=10的時候,c線程取出10號票以后,ticket還沒來的及減1,b線程就取出了ticket此時ticket還等于10;2、在ticket=1時,c線程取出了1號票,ticket還沒來的及減1,a、b線程就先后進入了if判斷語句,這時ticket減1了,那么當a、b線程取票的時候就取到了0號和-1號票。

出現了上述情況怎樣改變呢,我們可以這樣做:當一個線程要使用火車票這個資源時,我們就交給它一把鎖,等它把事情做完后在把鎖給另一個要用這個資源的線程。這樣就不會出現上述情況。 實現這個鎖的功能就需要用到synchronized這個關鍵字。

synchronized這個關鍵字有兩種用法1、放方法名前形成同步方法;2、放在塊前構成同步塊。

1、使用同步方法將上面的例子該為:

package com.pakage.ThreadAndRunnable; 
 
public class Runnable_demo implements Runnable{ 
  private int ticket=10; 
  public Runnable_demo(){    
  } 
  @Override 
  public void run() { 
    for(int i=0;i<20;i++){ 
        if(this.ticket>0){ 
          //休眠1s秒中,為了使效果更明顯,否則可能出不了效果 
          try { 
            Thread.sleep(1000); 
          } catch (Exception e) { 
            e.printStackTrace(); 
          } 
          this.sale(); 
        } 
       
    } 
  } 
   
  public synchronized void sale(){ 
    if(this.ticket>0){ 
      System.out.println(Thread.currentThread().getName()+"號窗口賣出:"+this.ticket--+"號票"); 
    } 
  } 
   
   public static void main(String args[]){ 
     Runnable_demo demo=new Runnable_demo(); 
     //基于火車票創建三個窗口 
     new Thread(demo,"a").start(); 
     new Thread(demo,"b").start(); 
     new Thread(demo,"c").start(); 
   } 
   
} 

程序的輸出結果為:

在Java項目中如何實現一個同步鎖

2、使用同步塊修改上面的例子:

package com.pakage.ThreadAndRunnable; 
 
public class Runnable_demo implements Runnable{ 
  private int ticket=10; 
  public Runnable_demo(){    
  } 
  @Override 
  public void run() { 
    for(int i=0;i<20;i++){ 
      <span >synchronized</span>(this){ 
        if(this.ticket>0){ 
          //休眠1s秒中,為了使效果更明顯,否則可能出不了效果 
          try { 
            Thread.sleep(1000); 
          } catch (Exception e) { 
            e.printStackTrace(); 
          } 
          System.out.println(Thread.currentThread().getName()+"號窗口賣出:"+this.ticket--+"號票"); 
        } 
      } 
       
    } 
  } 
   
   public static void main(String args[]){ 
     Runnable_demo demo=new Runnable_demo(); 
     //基于火車票創建三個窗口 
     new Thread(demo,"a").start(); 
     new Thread(demo,"b").start(); 
     new Thread(demo,"c").start(); 
   } 
   
} 

程序的輸出結果:

在Java項目中如何實現一個同步鎖

關于在Java項目中如何實現一個同步鎖問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陵川县| 黄平县| 泾阳县| 焦作市| 湖口县| 古田县| 岱山县| 芦溪县| 三河市| 当雄县| 泌阳县| 阜新市| 蓬安县| 峨边| 屏边| 厦门市| 江达县| 武强县| 屏南县| 遂溪县| 巴青县| 雷波县| 德令哈市| 顺昌县| 霍邱县| 湘潭县| 三台县| 兰州市| 临泉县| 长子县| 苍南县| 河间市| 德昌县| 佛冈县| 长丰县| 芷江| 江口县| 舞阳县| 安泽县| 大化| 鹤壁市|