黑马程序员——11,多线程,同步函数,死锁,一些零散的小知识点

来源:互联网 发布:淘宝查关键词排名 编辑:程序博客网 时间:2024/06/05 17:28

------<ahref="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

              黑马程序员——11,多线程,同步函数,死锁,一些零散的小知识点

//同步函数

 

class  A                     

{

         intsum;

         publicsynchronized void add(int aa,int bb)

                   //这里加了synchronized表示这是一个同步函数

         //只有一个线程进来执行完下面的同步代码块之后下一个线程才可以进来执行

         {

                 sum=aa+bb;

                            System.out.println("两个加起来的结果是"+sum);

         }

 

}

——————分割线————————

如何使用同步代码块来预防安全隐患,

先有两个前提:1,两个或者两个以上的线程2,多线程用的是同一个锁

接着主要就是要看多线程运行代码中哪些语句是操作共享数据的,找到了就用同步代码块或者同步函数来预防安全隐患。

同步函数用的锁是this而同步代码块用的锁是对象。

但是,如果函数被静态修饰了,那么再加上synchronized的话,这个同步函数的锁就不是this了,因为静态方法里面是不能够定义this 的。

那么静态的同步代码块的锁匙什么呢?

根据之前的讲解知道:静态进入内存时内存还没有本类的对象,但是一定会有该类对应的字节码文件对象。

类名.class    该类的类型是Class

所以, 静态的同步函数的锁是该函数所在的类的字节码文件对象,

就是: 静态同步函数所在类的类名.class

——————分割线————

在主函数中调用start方法使得线程开启之后,该线程并不一定就会马上调用对应的run方法,而是处于临时状态。

——————分割线——————

 

//同步函数的变形例题/*目的:让b1线程走同步代码块     让b2线程走同步函数*/ class Shoupiao implements Runnable       {         private  int piao=500;           Boolean f=true;    public void run()          {                    if(f)                    {                 while (true)              //特别说明:因为 while (true)这句话的关系,最后要按Ctrl+c按键才停下虚拟机,否则会耗费很多资源)                        {                                                     synchronized (this)//这里为什么要改成this呢?                               //因为为了防止安全隐患的前提是要用同一个锁,而非静态同步函数的锁就是this                               //所以要改成this                                     {                                                 if(  piao>0   )                                      {                                           try{Thread.sleep(12); }catch (Exceptione) {}                      System.out.println(Thread.currentThread().getName()+"————true票数"+piao--  );                                       }                                }                  }                    }                    else                    {                             while (true)                             {                         show();                             }                    }            }          public synchronized void show()//非静态同步函数         {               if(  piao>0   )                                 {                                      try{Thread.sleep(12); } catch (Exception e) {}                System.out.println(Thread.currentThread().getName()+"————false票数"+piao--  );                                  }         }} class Xiancheng8{         publicstatic void main(String[] args)         {                   Shoupiao  a=new Shoupiao();                                       Threadb1=new Thread(a);                         Thread b2=new Thread(a);                                     b1.start();       try{Thread.sleep(12); } catch (Exception e) {}                   /*                   这里加这句话的目的是让主线程停留短暂时间。                   因为如果主线程不停留短暂时间的话,在主线程中调                   用start方法使得b1线程开启之后,b1线程并不一定                   就会马上调用对应的run方法,而是处于临时状态。主线程继续                   执行下去使得a中的f变为false,再打开b2线程                   那么这样的话,b1线程和b2线程都会执行同步函数show。       主线程停留短暂时间后,CPU就会切换到b1线程执行下去                    */                   a.f=false;       b2.start();          }}/*以上程序编译运行的结果:Thread-0————true票数500Thread-0————true票数499Thread-0————true票数498Thread-1————false票数497Thread-1————false票数496Thread-1————false票数495Thread-1————false票数494Thread-1————false票数493Thread-1————false票数492Thread-1————false票数491Thread-1————false票数490Thread-1————false票数489Thread-1————false票数488Thread-1————false票数487Thread-1————false票数486Thread-1————false票数485Thread-1————false票数484Thread-1————false票数483Thread-1————false票数482Thread-1————false票数481Thread-1————false票数480Thread-1————false票数479Thread-1————false票数478Thread-1————false票数477Thread-1————false票数476Thread-1————false票数475Thread-1————false票数474Thread-1————false票数473Thread-1————false票数472Thread-1————false票数471Thread-1————false票数470Thread-1————false票数469Thread-1————false票数468Thread-1————false票数467Thread-1————false票数466Thread-1————false票数465Thread-1————false票数464Thread-1————false票数463Thread-1————false票数462Thread-1————false票数461Thread-1————false票数460Thread-1————false票数459Thread-1————false票数458Thread-1————false票数457Thread-1————false票数456Thread-1————false票数455Thread-1————false票数454Thread-1————false票数453Thread-1————false票数452Thread-1————false票数451Thread-1————false票数450Thread-1————false票数449Thread-1————false票数448Thread-1————false票数447Thread-1————false票数446Thread-1————false票数445Thread-1————false票数444Thread-1————false票数443Thread-1————false票数442Thread-1————false票数441Thread-1————false票数440Thread-1————false票数439Thread-1————false票数438Thread-1————false票数437Thread-1————false票数436Thread-1————false票数435Thread-1————false票数434Thread-1————false票数433Thread-1————false票数432Thread-1————false票数431Thread-1————false票数430Thread-1————false票数429Thread-1————false票数428Thread-1————false票数427Thread-1————false票数426Thread-1————false票数425Thread-1————false票数424Thread-1————false票数423Thread-1————false票数422Thread-1————false票数421Thread-1————false票数420Thread-1————false票数419Thread-1————false票数418Thread-1————false票数417Thread-1————false票数416Thread-1————false票数415Thread-1————false票数414Thread-1————false票数413Thread-1————false票数412Thread-1————false票数411Thread-1————false票数410Thread-1————false票数409Thread-1————false票数408Thread-1————false票数407Thread-1————false票数406Thread-1————false票数405Thread-1————false票数404Thread-1————false票数403Thread-1————false票数402Thread-1————false票数401Thread-1————false票数400Thread-1————false票数399Thread-1————false票数398Thread-1————false票数397Thread-1————false票数396Thread-1————false票数395Thread-1————false票数394Thread-1————false票数393Thread-1————false票数392Thread-1————false票数391Thread-1————false票数390Thread-1————false票数389Thread-1————false票数388Thread-1————false票数387Thread-1————false票数386Thread-1————false票数385Thread-1————false票数384Thread-1————false票数383Thread-1————false票数382Thread-1————false票数381Thread-1————false票数380Thread-1————false票数379Thread-1————false票数378Thread-1————false票数377Thread-1————false票数376Thread-1————false票数375Thread-1————false票数374Thread-1————false票数373Thread-1————false票数372Thread-1————false票数371Thread-1————false票数370Thread-1————false票数369Thread-1————false票数368Thread-1————false票数367Thread-1————false票数366Thread-1————false票数365Thread-1————false票数364Thread-1————false票数363Thread-1————false票数362Thread-1————false票数361Thread-1————false票数360Thread-1————false票数359Thread-1————false票数358Thread-1————false票数357Thread-1————false票数356Thread-1————false票数355Thread-1————false票数354Thread-1————false票数353Thread-1————false票数352Thread-1————false票数351Thread-1————false票数350Thread-1————false票数349Thread-1————false票数348Thread-1————false票数347Thread-1————false票数346Thread-1————false票数345Thread-1————false票数344Thread-1————false票数343Thread-1————false票数342Thread-1————false票数341Thread-1————false票数340Thread-1————false票数339Thread-1————false票数338Thread-1————false票数337Thread-1————false票数336Thread-1————false票数335Thread-1————false票数334Thread-1————false票数333Thread-1————false票数332Thread-1————false票数331Thread-1————false票数330Thread-1————false票数329Thread-1————false票数328Thread-1————false票数327Thread-1————false票数326Thread-1————false票数325Thread-1————false票数324Thread-1————false票数323Thread-1————false票数322Thread-1————false票数321Thread-1————false票数320Thread-1————false票数319Thread-1————false票数318Thread-1————false票数317Thread-1————false票数316Thread-1————false票数315Thread-1————false票数314Thread-1————false票数313Thread-1————false票数312Thread-1————false票数311Thread-1————false票数310Thread-1————false票数309Thread-1————false票数308Thread-1————false票数307Thread-1————false票数306Thread-1————false票数305Thread-1————false票数304Thread-1————false票数303Thread-1————false票数302Thread-1————false票数301Thread-1————false票数300Thread-1————false票数299Thread-1————false票数298Thread-1————false票数297Thread-1————false票数296Thread-1————false票数295Thread-1————false票数294Thread-1————false票数293Thread-1————false票数292Thread-1————false票数291Thread-1————false票数290Thread-1————false票数289Thread-1————false票数288Thread-1————false票数287Thread-1————false票数286Thread-1————false票数285Thread-1————false票数284Thread-1————false票数283Thread-1————false票数282Thread-1————false票数281Thread-1————false票数280Thread-1————false票数279Thread-1————false票数278Thread-1————false票数277Thread-1————false票数276Thread-1————false票数275Thread-1————false票数274Thread-1————false票数273Thread-1————false票数272Thread-1————false票数271Thread-1————false票数270Thread-1————false票数269Thread-1————false票数268Thread-1————false票数267Thread-1————false票数266Thread-1————false票数265Thread-1————false票数264Thread-1————false票数263Thread-1————false票数262Thread-1————false票数261Thread-1————false票数260Thread-1————false票数259Thread-1————false票数258Thread-1————false票数257Thread-1————false票数256Thread-1————false票数255Thread-1————false票数254Thread-1————false票数253Thread-1————false票数252Thread-1————false票数251Thread-1————false票数250Thread-1————false票数249Thread-1————false票数248Thread-1————false票数247Thread-1————false票数246Thread-1————false票数245Thread-0————true票数244Thread-0————true票数243Thread-0————true票数242Thread-0————true票数241Thread-0————true票数240Thread-0————true票数239Thread-0————true票数238Thread-0————true票数237Thread-0————true票数236Thread-0————true票数235Thread-0————true票数234Thread-0————true票数233Thread-0————true票数232Thread-0————true票数231Thread-0————true票数230Thread-0————true票数229Thread-0————true票数228Thread-0————true票数227Thread-0————true票数226Thread-0————true票数225Thread-0————true票数224Thread-0————true票数223Thread-0————true票数222Thread-0————true票数221Thread-0————true票数220Thread-0————true票数219Thread-0————true票数218Thread-0————true票数217Thread-0————true票数216Thread-0————true票数215Thread-0————true票数214Thread-0————true票数213Thread-0————true票数212Thread-0————true票数211Thread-0————true票数210Thread-0————true票数209Thread-0————true票数208Thread-0————true票数207Thread-0————true票数206Thread-0————true票数205Thread-0————true票数204Thread-0————true票数203Thread-0————true票数202Thread-0————true票数201Thread-0————true票数200Thread-0————true票数199Thread-0————true票数198Thread-0————true票数197Thread-0————true票数196Thread-0————true票数195Thread-0————true票数194Thread-0————true票数193Thread-0————true票数192Thread-0————true票数191Thread-0————true票数190Thread-0————true票数189Thread-0————true票数188Thread-0————true票数187Thread-0————true票数186Thread-0————true票数185Thread-0————true票数184Thread-0————true票数183Thread-0————true票数182Thread-0————true票数181Thread-0————true票数180Thread-0————true票数179Thread-0————true票数178Thread-0————true票数177Thread-0————true票数176Thread-0————true票数175Thread-0————true票数174Thread-0————true票数173Thread-0————true票数172Thread-0————true票数171Thread-0————true票数170Thread-0————true票数169Thread-0————true票数168Thread-0————true票数167Thread-0————true票数166Thread-0————true票数165Thread-0————true票数164Thread-0————true票数163Thread-0————true票数162Thread-0————true票数161Thread-0————true票数160Thread-0————true票数159Thread-0————true票数158Thread-0————true票数157Thread-0————true票数156Thread-0————true票数155Thread-0————true票数154Thread-0————true票数153Thread-0————true票数152Thread-0————true票数151Thread-0————true票数150Thread-0————true票数149Thread-0————true票数148Thread-0————true票数147Thread-0————true票数146Thread-0————true票数145Thread-0————true票数144Thread-0————true票数143Thread-0————true票数142Thread-0————true票数141Thread-0————true票数140Thread-0————true票数139Thread-0————true票数138Thread-0————true票数137Thread-0————true票数136Thread-0————true票数135Thread-0————true票数134Thread-0————true票数133Thread-0————true票数132Thread-0————true票数131Thread-0————true票数130Thread-0————true票数129Thread-0————true票数128Thread-0————true票数127Thread-0————true票数126Thread-0————true票数125Thread-0————true票数124Thread-0————true票数123Thread-0————true票数122Thread-0————true票数121Thread-0————true票数120Thread-0————true票数119Thread-0————true票数118Thread-0————true票数117Thread-0————true票数116Thread-0————true票数115Thread-0————true票数114Thread-0————true票数113Thread-0————true票数112Thread-0————true票数111Thread-0————true票数110Thread-0————true票数109Thread-0————true票数108Thread-0————true票数107Thread-0————true票数106Thread-0————true票数105Thread-0————true票数104Thread-0————true票数103Thread-0————true票数102Thread-0————true票数101Thread-0————true票数100Thread-0————true票数99Thread-0————true票数98Thread-0————true票数97Thread-0————true票数96Thread-0————true票数95Thread-0————true票数94Thread-0————true票数93Thread-0————true票数92Thread-0————true票数91Thread-0————true票数90Thread-0————true票数89Thread-0————true票数88Thread-0————true票数87Thread-0————true票数86Thread-0————true票数85Thread-0————true票数84Thread-0————true票数83Thread-0————true票数82Thread-0————true票数81Thread-0————true票数80Thread-0————true票数79Thread-0————true票数78Thread-0————true票数77Thread-0————true票数76Thread-0————true票数75Thread-0————true票数74Thread-0————true票数73Thread-0————true票数72Thread-0————true票数71Thread-0————true票数70Thread-0————true票数69Thread-0————true票数68Thread-0————true票数67Thread-0————true票数66Thread-0————true票数65Thread-0————true票数64Thread-0————true票数63Thread-0————true票数62Thread-0————true票数61Thread-0————true票数60Thread-0————true票数59Thread-0————true票数58Thread-0————true票数57Thread-0————true票数56Thread-0————true票数55Thread-0————true票数54Thread-1————false票数53Thread-1————false票数52Thread-1————false票数51Thread-1————false票数50Thread-1————false票数49Thread-1————false票数48Thread-1————false票数47Thread-1————false票数46Thread-1————false票数45Thread-1————false票数44Thread-1————false票数43Thread-1————false票数42Thread-1————false票数41Thread-1————false票数40Thread-1————false票数39Thread-1————false票数38Thread-1————false票数37Thread-1————false票数36Thread-1————false票数35Thread-1————false票数34Thread-1————false票数33Thread-1————false票数32Thread-1————false票数31Thread-1————false票数30Thread-1————false票数29Thread-1————false票数28Thread-1————false票数27Thread-1————false票数26Thread-1————false票数25Thread-1————false票数24Thread-1————false票数23Thread-1————false票数22Thread-1————false票数21Thread-1————false票数20Thread-1————false票数19Thread-1————false票数18Thread-1————false票数17Thread-1————false票数16Thread-1————false票数15Thread-1————false票数14Thread-1————false票数13Thread-1————false票数12Thread-1————false票数11Thread-1————false票数10Thread-1————false票数9Thread-1————false票数8Thread-1————false票数7Thread-1————false票数6Thread-1————false票数5Thread-1————false票数4Thread-1————false票数3Thread-1————false票数2Thread-1————false票数1 */

——————分割线————

/*多线程与之前学的懒汉式单例设计模式有关这里再复习一次*/ class Adx {      private static  final  Adx a=null;           private Adx(){}           public static  Adx   method()           {                if(a==null)                     {                        synchronized(Adx.class)                        {                            if( a==null   )                                      {                                          a=new Adx() ;                                      }                        }                     }                     return a;           }}

——————分割线——————

 

 //多线程中的死锁状况//死锁:同步中嵌套这同步//以下是一个简单的死锁例子: class Suo//单独定义一个类来存放锁{         staticObject a=new Object();//a锁         staticObject b=new Object();//b锁         //这里为了方便调用直接就修饰静态,可以用类名调用更加方便}class Shoupiao implements Runnable       {         private  int piao=500;         private  Boolean f;         Shoupiao(Boolean  f)         {           this.f=f;         }    public void run()          {                    if(f)                    {                          synchronized (Suo.a)                                     {                      synchronized (Suo.b)                                               {                                                 if(  piao>0   )                                      {                                           try{Thread.sleep(12); }catch (Exception e) {}                      System.out.println(Thread.currentThread().getName()+"————true票数"+piao--  );                                       }                                               }                                }                    }                    else                    {                          synchronized (Suo.b)                                     {                      synchronized (Suo.a)                                               {                                                 if(  piao>0   )                                      {                                           try{Thread.sleep(12); }catch (Exceptione) {}                      System.out.println(Thread.currentThread().getName()+"————false票数"+piao--  );                                       }                                               }                                }                    }            }        } class Xiancheng10{         publicstatic void main(String[] args)         {                   Threadb1=new Thread(new Shoupiao(true));                         Thread b2=new Thread(new Shoupiao(false));                                     b1.start();       b2.start();          }}//在这种情况下,b1线程与b2线程就会被死锁了,两个都没有办法执行下去 

0 0