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

java線程同步操作實例詳解

 更新時間:2018年09月06日 11:16:23   作者:shuair  
這篇文章主要介紹了java線程同步操作,結合實例形式分析了Java線程同步與鎖機制相關原理、操作技巧與注意事項,需要的朋友可以參考下

本文實例講述了java線程同步操作。分享給大家供大家參考,具體如下:

java線程同步

public class Hello {
  public static void main(String[] args) {
    MyRun myRun0 = new MyRun();
    new Thread(myRun0, "Thread0").start();
    new Thread(myRun0, "Thread1").start();
    new Thread(myRun0, "Thread2").start();
  }
}
class MyRun implements Runnable {
  private int k = 0;
  @Override
  public void run() {
    for (int i = 0; i < 3; i++) {
      System.out.println(Thread.currentThread().getName() + "**********" + i);
      k++;
      if (k <= 3) {
        if ("Thread0".equals(Thread.currentThread().getName())) {
          try {
            Thread.sleep(100);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
        System.out.println(Thread.currentThread().getName() + "," + k);
      }
    }
  }
}

輸出結果

Thread0**********0
Thread1**********0
Thread2**********0
Thread1,2
Thread2,3
Thread1**********1
Thread2**********1
Thread2**********2
Thread1**********2
Thread0,7
Thread0**********1
Thread0**********2

說明多線程在某些場景是存在問題的,有時候需要線程同步。

同步 synchronized

同步代碼塊,synchronized(obj){},obj是一個對象,在這里就相當于一把鎖,表示一旦有進程搶到了這把鎖的鑰匙(就是進入了代碼塊),其他進程將無法進入該鎖的代碼塊(當前代碼塊其他進程一定是進不來了,其他地方的代碼塊如果也是用了這把鎖,同樣進不去),只有代碼塊執(zhí)行完,釋放鎖后,所有進程再重新?lián)岃€匙。

注意,上同一把鎖的代碼塊都會被鎖住,這些代碼塊可能寫在不同方法不同位置上。

被同步代碼塊包住的代碼多個線程只能順次進入。

synchronized (this) {
  k++;
  if (k <= 3) {
    if ("Thread0".equals(Thread.currentThread().getName())) {
      try {
        Thread.sleep(100);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    System.out.println(Thread.currentThread().getName() + "," + k);
  }
}

this表示當前對象,這里考慮的只是運行這個方法,不涉及其它類也不涉及這個類的其它地方需要同步問題,所以用this也是可以的。k增加和輸出一個流程內只能有一個線程在訪問,所以可以得到想要的輸出結果

輸出結果

Thread0**********0
Thread1**********0
Thread2**********0
Thread0,1
Thread0**********1
Thread2,2
Thread2**********1
Thread1,3
Thread1**********1
Thread0**********2
Thread2**********2
Thread1**********2

對方法進行同步,如果存在多線程,每個線程順次訪問該方法

注意,如果一個類里面存在多個同步方法,那么這些同步方法的鎖是一個,都是當前對象,所以不同線程想同時訪問同一對象的不同方法也是不行的,因為這些方法都上了同一把鎖,但是鑰匙只有一把,只能一個線程持有。

@Override
public synchronized void run() {
  for (int i = 0; i < 3; i++) {
    System.out.println(Thread.currentThread().getName() + "**********" + i);
    k++;
    if (k <= 3) {
      if ("Thread0".equals(Thread.currentThread().getName())) {
        try {
          Thread.sleep(100);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
      System.out.println(Thread.currentThread().getName() + "," + k);
    }
  }
}

輸出結果

Thread0**********0
Thread0,1
Thread0**********1
Thread0,2
Thread0**********2
Thread0,3
Thread2**********0
Thread2**********1
Thread2**********2
Thread1**********0
Thread1**********1
Thread1**********2

死鎖

public class Hello {
  public static void main(String[] args) {
    A a = new A();
    B b = new B();
    new Thread(new MyRun(a,b)).start();
    new Thread(new MyRun1(a,b)).start();
  }
}
class MyRun implements Runnable{
  private A a;
  private B b;
  public MyRun(A a, B b) {
    this.a = a;
    this.b = b;
  }
  @Override
  public void run(){
    a.say(b);
  }
}
class MyRun1 implements Runnable {
  private A a;
  private B b;
  public MyRun1(A a, B b) {
    this.a = a;
    this.b = b;
  }
  @Override
  public void run() {
    b.say(a);
  }
}
class A{
  public synchronized void say(B b){
    System.out.println("A要知道B的信息");
    b.info();
  }
  public synchronized void info(){
    System.out.println("這是A");
  }
}
class B{
  public synchronized void say(A a){
    System.out.println("B要知道A的信息");
    a.info();
  }
  public synchronized void info(){
    System.out.println("這是B");
  }
}

如果兩個線程同時進入了兩個say方法,就是出現(xiàn)死鎖。

關鍵點在于一個對象的多個同步方法具有相同的鎖,都是當前對象。也就是x線程在訪問a對象的say方法過程中,y線程是無法訪問a對象的info方法的,因為開鎖的鑰匙已經被x線程搶占了。

上面的程序,如果線程x,y同時進入了兩個say方法,a對象同步方法的鎖被線程x搶占,b對象同步方法的鎖被線程y搶占,此時線程x無法訪問b對象的同步方法,線程y無法訪問a對象的同步方法。代碼中恰好想要訪問,所以就出現(xiàn)死鎖了。

更多java相關內容感興趣的讀者可查看本站專題:《Java進程與線程操作技巧總結》、《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設計有所幫助。

相關文章

  • 詳解Java MD5二次加密的應用

    詳解Java MD5二次加密的應用

    MD5的全稱是message-digest algorithm 5 信息-摘要算法。這篇文章主要為大家詳細介紹了Java中MD5二次加密的應用,感興趣的小伙伴可以了解一下
    2023-02-02
  • jxl 導出數(shù)據(jù)到excel的實例講解

    jxl 導出數(shù)據(jù)到excel的實例講解

    下面小編就為大家分享一篇jxl 導出數(shù)據(jù)到excel的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java?GUI實現(xiàn)學生成績管理系統(tǒng)

    Java?GUI實現(xiàn)學生成績管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java?GUI實現(xiàn)學生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • spring注入配置文件屬性到java類

    spring注入配置文件屬性到java類

    這篇文章主要為大家介紹了spring注入配置文件屬性到java類實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Java中Spring的創(chuàng)建和使用詳解

    Java中Spring的創(chuàng)建和使用詳解

    這篇文章主要介紹了Java中Spring的創(chuàng)建和使用詳解,Spring 是?個包含了眾多?具?法的 IoC 容器,既然是容器那么 它就具備兩個最基本的功能,將對象存儲到容器中,從容器中將對象取出來,需要的朋友可以參考下
    2023-08-08
  • Java基于遞歸和循環(huán)兩種方式實現(xiàn)未知維度集合的笛卡爾積算法示例

    Java基于遞歸和循環(huán)兩種方式實現(xiàn)未知維度集合的笛卡爾積算法示例

    這篇文章主要介紹了Java基于遞歸和循環(huán)兩種方式實現(xiàn)未知維度集合的笛卡爾積算法,結合實例形式分析了Java使用遞歸與循環(huán)兩種方式實現(xiàn)未知維度集合的笛卡爾積相關概念、原理與操作技巧,需要的朋友可以參考下
    2017-12-12
  • spring boot2結合mybatis增刪改查的實現(xiàn)

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

    這篇文章主要給大家介紹了關于spring boot2結合mybatis增刪改查的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot2具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • idea將maven項目改成Spring boot項目的方法步驟

    idea將maven項目改成Spring boot項目的方法步驟

    這篇文章主要介紹了idea將maven項目改成Spring boot項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Springboot整合MybatisPlus的實現(xiàn)過程解析

    Springboot整合MybatisPlus的實現(xiàn)過程解析

    這篇文章主要介紹了Springboot整合MybatisPlus的實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • java多線程Future和Callable類示例分享

    java多線程Future和Callable類示例分享

    JAVA多線程實現(xiàn)方式主要有三種:繼承Thread類、實現(xiàn)Runnable接口、使用ExecutorService、Callable、Future實現(xiàn)有返回結果的多線程。其中前兩種方式線程執(zhí)行完后都沒有返回值,只有最后一種是帶返回值的。今天我們就來研究下Future和Callable的實現(xiàn)方法
    2016-01-01

最新評論

陆良县| 富川| 沾益县| 鄂伦春自治旗| 南岸区| 古蔺县| 汉寿县| 襄垣县| 玉门市| 汕头市| 徐州市| 盐池县| 衡南县| 松原市| 永宁县| 兰溪市| 红桥区| 莱州市| 黑水县| 舒兰市| 新化县| 松阳县| 喀喇| 鸡东县| 两当县| 铜山县| 清远市| 河源市| 峨眉山市| 潞西市| 桓仁| 积石山| 青浦区| 炉霍县| 邻水| 和平县| 鹿邑县| 宜丰县| 屯门区| 玉门市| 东莞市|