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

Java同步函數(shù)代碼詳解

 更新時(shí)間:2017年10月09日 08:35:03   作者:凌風(fēng)暨  
這篇文章主要介紹了Java線程中的同步函數(shù)的相關(guān)內(nèi)容,涉及了實(shí)例代碼,需要的朋友,可以參考下。
/*
同步函數(shù)
當(dāng)函數(shù)中的代碼全部放在了同步代碼塊中,那么這個(gè)函數(shù)就是同步函數(shù)
*/
//同步函數(shù)的鎖是this鎖,this是一個(gè)引用,this指向的對(duì)象就是鎖
//下面證明一下同步函數(shù)的鎖就是this
//創(chuàng)建兩個(gè)線程,一個(gè)在同步代碼塊中執(zhí)行,另一個(gè)在同步函數(shù)中執(zhí)行
//同步代碼塊用的鎖是obj,同步函數(shù)用的所是this
//這就導(dǎo)致了兩個(gè)線程存在兩把鎖,會(huì)出現(xiàn)上次所說(shuō)的安全問(wèn)題,即出現(xiàn)錯(cuò)誤數(shù)據(jù)
//只有兩個(gè)線程同時(shí)用一把鎖,才能解決多線程的安全問(wèn)題
class Ticket implements Runnable{
  private int num = 50;//當(dāng)用靜態(tài)同步函數(shù)時(shí),需要將對(duì)象也改為靜態(tài)的
  private Object obj = new Object();
  //加一個(gè)flag標(biāo)記,一個(gè)線程得到CPU,判斷flag值
  //如果是true,讓他在同步代碼塊中執(zhí)行,一旦進(jìn)去就出不來(lái)了,因?yàn)槿蝿?wù)代碼為死循環(huán)
  //否則讓他在同步函數(shù)中執(zhí)行
  boolean flag = true;
  public void run(){
    if(flag){
      while(true){
        //同步代碼塊,這里用的鎖是obj,與同步函數(shù)用不一樣的鎖,會(huì)出現(xiàn)安全問(wèn)題
        //synchronized(obj){
        //將鎖改為this,與同步函數(shù)為同一把鎖,就沒(méi)有問(wèn)題了
        synchronized(this){//如果下面是靜態(tài)同步函數(shù),則應(yīng)該把this改為Ticket.class,同一把鎖
          if(num>0){
            //強(qiáng)制線程放棄CPU,睡眠的線程不會(huì)放棄鎖
            try{Thread.sleep(20);}catch(InterruptedException e){e.printStackTrace();}
            System.out.println(Thread.currentThread().getName()+"...sale..."+num--);//1
          }
        }//釋放鎖
      }
    }
    else{
      while(true){
        fun();
      }
    }
  }
  ////靜態(tài)函數(shù)進(jìn)內(nèi)存的時(shí)候不存在對(duì)象,但是存在其所屬類的字節(jié)碼文件對(duì)象,屬于Class類型的對(duì)象,
  //鎖必須是對(duì)象,字節(jié)碼文件,也是個(gè)對(duì)象,所以,靜態(tài)同步函數(shù)的鎖就是其所屬類的字節(jié)碼文件對(duì)象
  //public static synchronized void fun(){//鎖為Ticket.class
  //這個(gè)函數(shù)的代碼都是同步代碼塊中的,所以這個(gè)函數(shù)可以修飾為同步的,即同步函數(shù)
  public synchronized void fun(){
    if(num>0){
      //強(qiáng)制線程放棄CPU,睡眠的線程不會(huì)放棄鎖
      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先啟動(dòng),但是他并不一定能搶到CPU,主線程依舊拿著CPU
    //主線程拿著CPU往下走,將flag改為了false,導(dǎo)致兩個(gè)
    //線程同時(shí)用的一個(gè)任務(wù)代碼,即一把鎖,不會(huì)出現(xiàn)安全問(wèn)題,所以,應(yīng)該在此處
    //讓主線程進(jìn)入睡眠狀態(tài),主線程放棄CPU,然后t1立刻拿到CPU,
    //這樣t1就可以,在flag是true的情況下,進(jìn)入同步代碼塊中執(zhí)行
    //所以t1用的就是obj鎖,然后主線程再拿上CPU,將flag改為false
    //t2拿上CPU時(shí),flag就為false,所以進(jìn)入的是同步函數(shù)中執(zhí)行,
    //同步函數(shù)用的鎖是this,兩把鎖,肯定會(huì)出現(xiàn)線程安全問(wèn)題,所以,
    //如果想解決安全問(wèn)題,將同步代碼塊的鎖,也改為this,即可解決
    //讓主線程放棄CPU
    try{
      Thread.sleep(20);
    }catch(InterruptedException e){
      e.printStackTrace();
    }
    t.flag = false;
    t2.start();
  }
}

總結(jié)

同步函數(shù)的鎖是this,靜態(tài)同步函數(shù)的鎖是他所屬類的字節(jié)碼文件對(duì)象。

以上就是本文關(guān)于Java同步函數(shù)代碼詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助,感興趣的朋友可以參閱:Java多線程ForkJoinPool實(shí)例詳解  Java通過(guò)賣票理解多線程  Java線程安全基礎(chǔ)概念解析等,感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java實(shí)現(xiàn)屏幕截圖及剪裁

    Java實(shí)現(xiàn)屏幕截圖及剪裁

    這是一篇入門級(jí)文章,高手請(qǐng)略過(guò)。在這篇文章中我們將學(xué)習(xí)如何用 Java 對(duì)圖像進(jìn)行剪裁并將剪裁出來(lái)的部分單獨(dú)保存到文件中。
    2014-09-09
  • Java多線程使用阻塞隊(duì)列實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型詳解

    Java多線程使用阻塞隊(duì)列實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型詳解

    這篇文章主要介紹了Java多線程使用阻塞隊(duì)列實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型詳解,主要講解阻塞隊(duì)列的特性、實(shí)際開發(fā)中常用的到的生產(chǎn)者消費(fèi)者模型,以及生產(chǎn)者消費(fèi)者模型解耦合、削峰填谷的好處,需要的朋友可以參考下
    2023-07-07
  • 淺談Java并發(fā)中的內(nèi)存模型

    淺談Java并發(fā)中的內(nèi)存模型

    這篇文章主要介紹了Java并發(fā)中的內(nèi)存模型,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • Spring中@Value注解的三種使用方式詳解

    Spring中@Value注解的三種使用方式詳解

    這篇文章主要介紹了Spring中@Value注解的三種使用方式詳解,文章通過(guò)示例代碼非常詳細(xì)地介紹,對(duì)于每個(gè)人的學(xué)習(xí)或工作都有一定的學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Java 判斷IP地址的合法性實(shí)例詳解

    Java 判斷IP地址的合法性實(shí)例詳解

    這篇文章主要介紹了Java 判斷IP地址的合法性實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 為什么阿里要慎重使用ArrayList中的subList方法

    為什么阿里要慎重使用ArrayList中的subList方法

    這篇文章主要介紹了為什么要慎重使用ArrayList中的subList方法,subList是List接口中定義的一個(gè)方法,該方法主要用于返回一個(gè)集合中的一段、可以理解為截取一個(gè)集合中的部分元素,他的返回值也是一個(gè)List。,需要的朋友可以參考下
    2019-06-06
  • SpringBoot線上環(huán)境徹底關(guān)閉Swagger-UI的方式

    SpringBoot線上環(huán)境徹底關(guān)閉Swagger-UI的方式

    這篇文章主要給大家介紹了SpringBoot線上環(huán)境徹底關(guān)閉Swagger-UI的方式,文中給出了詳細(xì)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • 淺談Spring 重定向指南

    淺談Spring 重定向指南

    本篇文章主要介紹了淺談Spring 重定向指南,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Java泛型和Class類用法示例

    Java泛型和Class類用法示例

    這篇文章主要介紹了Java泛型和Class類用法,結(jié)合實(shí)例形式分析了java使用泛型限制class類避免強(qiáng)制類型轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • Spring Boot中@value的常見用法及案例

    Spring Boot中@value的常見用法及案例

    @Value注解是Spring框架中強(qiáng)大且常用的注解之一,本文主要介紹了SpringBoot中@value的常見用法及案例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09

最新評(píng)論

且末县| 寿阳县| 金沙县| 青河县| 沽源县| 隆德县| 保山市| 漯河市| 峨边| 九龙坡区| 商南县| 乌什县| 浮山县| 汪清县| 莱芜市| 洪湖市| 澄迈县| 博湖县| 米林县| 延寿县| 潮安县| 无极县| 普陀区| 九台市| 勃利县| 弋阳县| 民县| 盈江县| 裕民县| 淳化县| 安图县| 辽宁省| 九龙县| 资兴市| 瑞昌市| 临泉县| 武清区| 湟中县| 兴安县| 灵宝市| 博野县|