91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

利用Java怎么實現一個同步函數

發布時間:2020-12-07 17:01:47 來源:億速云 閱讀:183 作者:Leah 欄目:編程語言

本篇文章為大家展示了利用Java怎么實現一個同步函數,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

具體方法如下:

/*
同步函數
當函數中的代碼全部放在了同步代碼塊中,那么這個函數就是同步函數
*/
//同步函數的鎖是this鎖,this是一個引用,this指向的對象就是鎖
//下面證明一下同步函數的鎖就是this
//創建兩個線程,一個在同步代碼塊中執行,另一個在同步函數中執行
//同步代碼塊用的鎖是obj,同步函數用的所是this
//這就導致了兩個線程存在兩把鎖,會出現上次所說的安全問題,即出現錯誤數據
//只有兩個線程同時用一把鎖,才能解決多線程的安全問題
class Ticket implements Runnable{
  private int num = 50;//當用靜態同步函數時,需要將對象也改為靜態的
  private Object obj = new Object();
  //加一個flag標記,一個線程得到CPU,判斷flag值
  //如果是true,讓他在同步代碼塊中執行,一旦進去就出不來了,因為任務代碼為死循環
  //否則讓他在同步函數中執行
  boolean flag = true;
  public void run(){
    if(flag){
      while(true){
        //同步代碼塊,這里用的鎖是obj,與同步函數用不一樣的鎖,會出現安全問題
        //synchronized(obj){
        //將鎖改為this,與同步函數為同一把鎖,就沒有問題了
        synchronized(this){//如果下面是靜態同步函數,則應該把this改為Ticket.class,同一把鎖
          if(num>0){
            //強制線程放棄CPU,睡眠的線程不會放棄鎖
            try{Thread.sleep(20);}catch(InterruptedException e){e.printStackTrace();}
            System.out.println(Thread.currentThread().getName()+"...sale..."+num--);//1
          }
        }//釋放鎖
      }
    }
    else{
      while(true){
        fun();
      }
    }
  }
  ////靜態函數進內存的時候不存在對象,但是存在其所屬類的字節碼文件對象,屬于Class類型的對象,
  //鎖必須是對象,字節碼文件,也是個對象,所以,靜態同步函數的鎖就是其所屬類的字節碼文件對象
  //public static synchronized void fun(){//鎖為Ticket.class
  //這個函數的代碼都是同步代碼塊中的,所以這個函數可以修飾為同步的,即同步函數
  public synchronized void fun(){
    if(num>0){
      //強制線程放棄CPU,睡眠的線程不會放棄鎖
      try{Thread.sleep(20);}catch(InterruptedException e){e.printStackTrace();}
      System.out.println(Thread.currentThread().getName()+"...sale..."+num--);//1
    }
  }
}
class test{
  public static void main(String[] args){
    Ticket t = new Ticket();
    Thread t1 = new Thread(t);
    Thread t2 = new Thread(t);
    t1.start();
    //t1先啟動,但是他并不一定能搶到CPU,主線程依舊拿著CPU
    //主線程拿著CPU往下走,將flag改為了false,導致兩個
    //線程同時用的一個任務代碼,即一把鎖,不會出現安全問題,所以,應該在此處
    //讓主線程進入睡眠狀態,主線程放棄CPU,然后t1立刻拿到CPU,
    //這樣t1就可以,在flag是true的情況下,進入同步代碼塊中執行
    //所以t1用的就是obj鎖,然后主線程再拿上CPU,將flag改為false
    //t2拿上CPU時,flag就為false,所以進入的是同步函數中執行,
    //同步函數用的鎖是this,兩把鎖,肯定會出現線程安全問題,所以,
    //如果想解決安全問題,將同步代碼塊的鎖,也改為this,即可解決
    //讓主線程放棄CPU
    try{
      Thread.sleep(20);
    }catch(InterruptedException e){
      e.printStackTrace();
    }
    t.flag = false;
    t2.start();
  }
}

總結

同步函數的鎖是this,靜態同步函數的鎖是他所屬類的字節碼文件對象。

上述內容就是利用Java怎么實現一個同步函數,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

柳江县| 金沙县| 临江市| 大英县| 桂东县| 新民市| 华阴市| 邛崃市| 新巴尔虎右旗| 庆阳市| 当涂县| 德钦县| 盱眙县| 东乡族自治县| 西林县| 泰来县| 淮北市| 陆河县| 马关县| 阿坝| 定襄县| 万全县| 新巴尔虎左旗| 揭东县| 河源市| 兴化市| 且末县| 巴青县| 莲花县| 巴彦淖尔市| 苗栗县| 色达县| 辽宁省| 楚雄市| 苍山县| 南溪县| 分宜县| 元氏县| 彭阳县| 樟树市| 云林县|