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

JAVA線程同步實(shí)例教程

 更新時(shí)間:2014年08月27日 12:00:53   投稿:shichen2014  
這篇文章主要介紹了JAVA線程同步實(shí)例教程,在Java程序設(shè)計(jì)中有著非常廣泛的應(yīng)用,需要的朋友可以參考下

線程是Java程序設(shè)計(jì)里非常重要的概念,本文就以實(shí)例形式對此加以詳細(xì)解讀。具體分析如下:

首先,線程加鎖有什么用處呢?舉個(gè)例子:比如你現(xiàn)在有30000塊大洋在銀行存著,現(xiàn)在你到銀行取錢,當(dāng)你輸入密碼完成后,已經(jīng)輸入取款金額,比如你輸入的是20000,就是在銀行給你拿錢這個(gè)時(shí)刻,你老婆也去銀行取這筆錢,你老婆同樣取20000,因?yàn)榇藭r(shí)你的賬上仍然是30000,所以銀行同樣的操作在你老婆那端又進(jìn)行了一遍,這樣當(dāng)你們兩個(gè)完成各自操作后,銀行記錄的你賬上還應(yīng)該有10000塊存款,這樣是不是很爽。解決這個(gè)問題就用到了線程加鎖的知識,下面就讓我們一起來學(xué)習(xí)一下吧。

一、未處理線程同步的一個(gè)例子:

public class TextSync implements Runnable{
  /**未處理線程同步
   * @param args
   */
  Time time = new Time();
  public static void main(String[] args) {
    TextSync text = new TextSync();
    Thread t1 = new Thread(text);
    Thread t2 = new Thread(text);
    t1.setName("t1");
    t2.setName("t2");
    t1.start();
    t2.start();
  }
  @Override
  public void run() {
    time.add(Thread.currentThread().getName());
  }
}
class Time {
  private static int num = 0;
  public void add(String name){
    try {
      num++;
      //當(dāng)?shù)谝粋€(gè)線程執(zhí)行到此時(shí),num變成了1,第一個(gè)線程暫停一秒,
      //第二個(gè)線程開始執(zhí)行,當(dāng)?shù)诙€(gè)線程執(zhí)行到此時(shí),num變成了2,第二個(gè)線程暫停一秒,
      //第一個(gè)線程此時(shí)的num同樣變成了2,所以最終的結(jié)果均為2;
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println(name+"是第"+num+"個(gè)執(zhí)行的線程。");
  }
}

輸出結(jié)果:

t2是第2個(gè)執(zhí)行的線程。
t1是第2個(gè)執(zhí)行的線程。

二、線程同步

public class TextSynctwo implements Runnable{
  /**線程同步
   * @param args
   */
  Time1 time = new Time1();
  public static void main(String[] args) {
    TextSynctwo text = new TextSynctwo();
    Thread t1 = new Thread(text);
    Thread t2 = new Thread(text);
    t1.setName("t1");
    t2.setName("t2");
    t1.start();
    t2.start();
  }
  @Override
  public void run() {
    time.add(Thread.currentThread().getName());
  }
}
class Time1 {
  private static int num = 0;
  
  //synchronized鎖定當(dāng)前線程,可以在方法定義時(shí)進(jìn)行聲明,或采用在方法中進(jìn)行設(shè)置。
  public synchronized void add(String name){
    //synchronized (this) {//鎖定當(dāng)前線程,防止此時(shí)被別的線程執(zhí)行
      try {
        num++;
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println(name+"是第"+num+"個(gè)執(zhí)行的線程。");
    //}
  }
}

輸出結(jié)果:

t1是第1個(gè)執(zhí)行的線程。
t2是第2個(gè)執(zhí)行的線程。

三、死鎖

public class TestDeadLock implements Runnable{
  /**死鎖
   * @param args
   */
  private int flag = 0 ; 
  static Object o1 = new Object();
  static Object o2 = new Object();
  public static void main(String[] args) {
    TestDeadLock td1 = new TestDeadLock(); 
    TestDeadLock td2 = new TestDeadLock(); 
    td1.flag = 1;
    td2.flag = 2;
    Thread t1 = new Thread(td1); 
    Thread t2 = new Thread(td2);
    t1.setName("t1");
    t2.setName("t2");
    t1.start();
    t2.start();
  }

  @Override
  public void run() {
    System.out.println(Thread.currentThread().getName());
    if(flag == 1){
      synchronized(o1){
        try {
          Thread.sleep(5000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        synchronized(o2){
          System.out.println("1");
        }
      }
    }
    if(flag == 2){
      synchronized(o2){
        try {
          Thread.sleep(5000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        synchronized(o1){
          System.out.println("2");
        }
      }
    }
  }
}

四、鎖定

public class TT implements Runnable{
  /**鎖定
   * @param args
   */
  int b = 100;
  public static void main(String[] args) {
    TT tt = new TT();
    Thread th = new Thread(tt);
    th.start();
    try {
      tt.m2();
    } catch (Exception e) {
      e.printStackTrace();
    }
    System.out.println(tt.b);
  }
  @Override
  public void run() {
    try {
      m1();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  private synchronized void m1() throws Exception{
    b = 1000;
    Thread.sleep(5000);
    System.out.println("b="+b);
  }
  private synchronized void m2() throws Exception{
    Thread.sleep(2500);
    b = 2500;
  } 
}

現(xiàn)在的輸出結(jié)果是:

1000
b=1000

可見這里m2先執(zhí)行,m1要等m2執(zhí)行完畢后方可執(zhí)行。

希望本文所述對大家的Java程序設(shè)計(jì)有所幫助

相關(guān)文章

  • springboot如何關(guān)掉tomcat容器

    springboot如何關(guān)掉tomcat容器

    這篇文章主要介紹了springboot如何關(guān)掉tomcat容器,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 解決Springboot @WebFilter攔截器未生效問題

    解決Springboot @WebFilter攔截器未生效問題

    這篇文章主要介紹了解決Springboot @WebFilter攔截器未生效問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java后端配置允許跨域方式

    Java后端配置允許跨域方式

    本文介紹了在不同技術(shù)和框架中配置跨域資源共享(CORS)的方法,包括使用SpringMVC的@CrossOrigin注解、SpringBoot的全局CORS配置、SpringSecurity中的CORS集成以及手動(dòng)設(shè)置響應(yīng)頭,根據(jù)具體需求和技術(shù)棧,選擇合適的方法來確??缬蛘埱蟮陌踩院陀行?/div> 2025-02-02
  • Java中關(guān)于http請求獲取FlexManager某設(shè)備分組監(jiān)控點(diǎn)

    Java中關(guān)于http請求獲取FlexManager某設(shè)備分組監(jiān)控點(diǎn)

    這篇文章主要介紹了Java中關(guān)于http請求獲取FlexManager某設(shè)備分組監(jiān)控點(diǎn),本文僅僅介紹了使用http請求獲取FlexManager平臺某個(gè)FBox盒子即某設(shè)備的監(jiān)控點(diǎn)分組的分組下的所有監(jiān)控點(diǎn)信息,需要的朋友可以參考下
    2022-10-10
  • MyBatis中正則使用foreach拼接字符串

    MyBatis中正則使用foreach拼接字符串

    這篇文章主要介紹了MyBatis中正則使用foreach拼接字符串,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • MyBatis中使用$和#所遇到的問題及解決辦法

    MyBatis中使用$和#所遇到的問題及解決辦法

    這篇文章主要介紹了MyBatis中使用$和#所遇到的問題及解決辦法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • Java填充替換數(shù)組元素實(shí)例詳解

    Java填充替換數(shù)組元素實(shí)例詳解

    這篇文章主要通過兩個(gè)實(shí)例說明Java填充和替換數(shù)組中元素的方法,需要的朋友可以參考下。
    2017-08-08
  • java實(shí)現(xiàn)潛艇大戰(zhàn)游戲源碼

    java實(shí)現(xiàn)潛艇大戰(zhàn)游戲源碼

    潛艇大戰(zhàn)游戲相信大家都玩過,是一款非常有趣的小游戲,那么基于代碼是如何實(shí)現(xiàn)的呢?今天小編給大家?guī)硪黄坛處椭蠹覍W(xué)習(xí)java實(shí)現(xiàn)潛艇大戰(zhàn)游戲,感謝的朋友一起看看吧
    2021-06-06
  • Java 使用json-lib處理JSON詳解及實(shí)例代碼

    Java 使用json-lib處理JSON詳解及實(shí)例代碼

    這篇文章主要介紹了Java 使用json-lib處理JSON詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java  隊(duì)列 Queue 用法實(shí)例詳解

    Java 隊(duì)列 Queue 用法實(shí)例詳解

    本文實(shí)例講述了Java內(nèi)置隊(duì)列類Queue用法,分享給大家供大家參考
    2017-04-04

最新評論

衡阳县| 奉化市| 塔城市| 玉田县| 宝兴县| 资源县| 荔波县| 乐至县| 博兴县| 陕西省| 开平市| 古交市| 柯坪县| 白朗县| 横峰县| 灵山县| 德令哈市| 东丰县| 昭觉县| 阳山县| 正安县| 镇安县| 博湖县| 射阳县| 松潘县| 来安县| 八宿县| 厦门市| 青海省| 金塔县| 临泽县| 密山市| 九台市| 竹北市| 奈曼旗| 浦东新区| 勐海县| 柳江县| 庆城县| 盱眙县| 梁山县|