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

------<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票数500
Thread-0————true票数499
Thread-0————true票数498
Thread-1————false票数497
Thread-1————false票数496
Thread-1————false票数495
Thread-1————false票数494
Thread-1————false票数493
Thread-1————false票数492
Thread-1————false票数491
Thread-1————false票数490
Thread-1————false票数489
Thread-1————false票数488
Thread-1————false票数487
Thread-1————false票数486
Thread-1————false票数485
Thread-1————false票数484
Thread-1————false票数483
Thread-1————false票数482
Thread-1————false票数481
Thread-1————false票数480
Thread-1————false票数479
Thread-1————false票数478
Thread-1————false票数477
Thread-1————false票数476
Thread-1————false票数475
Thread-1————false票数474
Thread-1————false票数473
Thread-1————false票数472
Thread-1————false票数471
Thread-1————false票数470
Thread-1————false票数469
Thread-1————false票数468
Thread-1————false票数467
Thread-1————false票数466
Thread-1————false票数465
Thread-1————false票数464
Thread-1————false票数463
Thread-1————false票数462
Thread-1————false票数461
Thread-1————false票数460
Thread-1————false票数459
Thread-1————false票数458
Thread-1————false票数457
Thread-1————false票数456
Thread-1————false票数455
Thread-1————false票数454
Thread-1————false票数453
Thread-1————false票数452
Thread-1————false票数451
Thread-1————false票数450
Thread-1————false票数449
Thread-1————false票数448
Thread-1————false票数447
Thread-1————false票数446
Thread-1————false票数445
Thread-1————false票数444
Thread-1————false票数443
Thread-1————false票数442
Thread-1————false票数441
Thread-1————false票数440
Thread-1————false票数439
Thread-1————false票数438
Thread-1————false票数437
Thread-1————false票数436
Thread-1————false票数435
Thread-1————false票数434
Thread-1————false票数433
Thread-1————false票数432
Thread-1————false票数431
Thread-1————false票数430
Thread-1————false票数429
Thread-1————false票数428
Thread-1————false票数427
Thread-1————false票数426
Thread-1————false票数425
Thread-1————false票数424
Thread-1————false票数423
Thread-1————false票数422
Thread-1————false票数421
Thread-1————false票数420
Thread-1————false票数419
Thread-1————false票数418
Thread-1————false票数417
Thread-1————false票数416
Thread-1————false票数415
Thread-1————false票数414
Thread-1————false票数413
Thread-1————false票数412
Thread-1————false票数411
Thread-1————false票数410
Thread-1————false票数409
Thread-1————false票数408
Thread-1————false票数407
Thread-1————false票数406
Thread-1————false票数405
Thread-1————false票数404
Thread-1————false票数403
Thread-1————false票数402
Thread-1————false票数401
Thread-1————false票数400
Thread-1————false票数399
Thread-1————false票数398
Thread-1————false票数397
Thread-1————false票数396
Thread-1————false票数395
Thread-1————false票数394
Thread-1————false票数393
Thread-1————false票数392
Thread-1————false票数391
Thread-1————false票数390
Thread-1————false票数389
Thread-1————false票数388
Thread-1————false票数387
Thread-1————false票数386
Thread-1————false票数385
Thread-1————false票数384
Thread-1————false票数383
Thread-1————false票数382
Thread-1————false票数381
Thread-1————false票数380
Thread-1————false票数379
Thread-1————false票数378
Thread-1————false票数377
Thread-1————false票数376
Thread-1————false票数375
Thread-1————false票数374
Thread-1————false票数373
Thread-1————false票数372
Thread-1————false票数371
Thread-1————false票数370
Thread-1————false票数369
Thread-1————false票数368
Thread-1————false票数367
Thread-1————false票数366
Thread-1————false票数365
Thread-1————false票数364
Thread-1————false票数363
Thread-1————false票数362
Thread-1————false票数361
Thread-1————false票数360
Thread-1————false票数359
Thread-1————false票数358
Thread-1————false票数357
Thread-1————false票数356
Thread-1————false票数355
Thread-1————false票数354
Thread-1————false票数353
Thread-1————false票数352
Thread-1————false票数351
Thread-1————false票数350
Thread-1————false票数349
Thread-1————false票数348
Thread-1————false票数347
Thread-1————false票数346
Thread-1————false票数345
Thread-1————false票数344
Thread-1————false票数343
Thread-1————false票数342
Thread-1————false票数341
Thread-1————false票数340
Thread-1————false票数339
Thread-1————false票数338
Thread-1————false票数337
Thread-1————false票数336
Thread-1————false票数335
Thread-1————false票数334
Thread-1————false票数333
Thread-1————false票数332
Thread-1————false票数331
Thread-1————false票数330
Thread-1————false票数329
Thread-1————false票数328
Thread-1————false票数327
Thread-1————false票数326
Thread-1————false票数325
Thread-1————false票数324
Thread-1————false票数323
Thread-1————false票数322
Thread-1————false票数321
Thread-1————false票数320
Thread-1————false票数319
Thread-1————false票数318
Thread-1————false票数317
Thread-1————false票数316
Thread-1————false票数315
Thread-1————false票数314
Thread-1————false票数313
Thread-1————false票数312
Thread-1————false票数311
Thread-1————false票数310
Thread-1————false票数309
Thread-1————false票数308
Thread-1————false票数307
Thread-1————false票数306
Thread-1————false票数305
Thread-1————false票数304
Thread-1————false票数303
Thread-1————false票数302
Thread-1————false票数301
Thread-1————false票数300
Thread-1————false票数299
Thread-1————false票数298
Thread-1————false票数297
Thread-1————false票数296
Thread-1————false票数295
Thread-1————false票数294
Thread-1————false票数293
Thread-1————false票数292
Thread-1————false票数291
Thread-1————false票数290
Thread-1————false票数289
Thread-1————false票数288
Thread-1————false票数287
Thread-1————false票数286
Thread-1————false票数285
Thread-1————false票数284
Thread-1————false票数283
Thread-1————false票数282
Thread-1————false票数281
Thread-1————false票数280
Thread-1————false票数279
Thread-1————false票数278
Thread-1————false票数277
Thread-1————false票数276
Thread-1————false票数275
Thread-1————false票数274
Thread-1————false票数273
Thread-1————false票数272
Thread-1————false票数271
Thread-1————false票数270
Thread-1————false票数269
Thread-1————false票数268
Thread-1————false票数267
Thread-1————false票数266
Thread-1————false票数265
Thread-1————false票数264
Thread-1————false票数263
Thread-1————false票数262
Thread-1————false票数261
Thread-1————false票数260
Thread-1————false票数259
Thread-1————false票数258
Thread-1————false票数257
Thread-1————false票数256
Thread-1————false票数255
Thread-1————false票数254
Thread-1————false票数253
Thread-1————false票数252
Thread-1————false票数251
Thread-1————false票数250
Thread-1————false票数249
Thread-1————false票数248
Thread-1————false票数247
Thread-1————false票数246
Thread-1————false票数245
Thread-0————true票数244
Thread-0————true票数243
Thread-0————true票数242
Thread-0————true票数241
Thread-0————true票数240
Thread-0————true票数239
Thread-0————true票数238
Thread-0————true票数237
Thread-0————true票数236
Thread-0————true票数235
Thread-0————true票数234
Thread-0————true票数233
Thread-0————true票数232
Thread-0————true票数231
Thread-0————true票数230
Thread-0————true票数229
Thread-0————true票数228
Thread-0————true票数227
Thread-0————true票数226
Thread-0————true票数225
Thread-0————true票数224
Thread-0————true票数223
Thread-0————true票数222
Thread-0————true票数221
Thread-0————true票数220
Thread-0————true票数219
Thread-0————true票数218
Thread-0————true票数217
Thread-0————true票数216
Thread-0————true票数215
Thread-0————true票数214
Thread-0————true票数213
Thread-0————true票数212
Thread-0————true票数211
Thread-0————true票数210
Thread-0————true票数209
Thread-0————true票数208
Thread-0————true票数207
Thread-0————true票数206
Thread-0————true票数205
Thread-0————true票数204
Thread-0————true票数203
Thread-0————true票数202
Thread-0————true票数201
Thread-0————true票数200
Thread-0————true票数199
Thread-0————true票数198
Thread-0————true票数197
Thread-0————true票数196
Thread-0————true票数195
Thread-0————true票数194
Thread-0————true票数193
Thread-0————true票数192
Thread-0————true票数191
Thread-0————true票数190
Thread-0————true票数189
Thread-0————true票数188
Thread-0————true票数187
Thread-0————true票数186
Thread-0————true票数185
Thread-0————true票数184
Thread-0————true票数183
Thread-0————true票数182
Thread-0————true票数181
Thread-0————true票数180
Thread-0————true票数179
Thread-0————true票数178
Thread-0————true票数177
Thread-0————true票数176
Thread-0————true票数175
Thread-0————true票数174
Thread-0————true票数173
Thread-0————true票数172
Thread-0————true票数171
Thread-0————true票数170
Thread-0————true票数169
Thread-0————true票数168
Thread-0————true票数167
Thread-0————true票数166
Thread-0————true票数165
Thread-0————true票数164
Thread-0————true票数163
Thread-0————true票数162
Thread-0————true票数161
Thread-0————true票数160
Thread-0————true票数159
Thread-0————true票数158
Thread-0————true票数157
Thread-0————true票数156
Thread-0————true票数155
Thread-0————true票数154
Thread-0————true票数153
Thread-0————true票数152
Thread-0————true票数151
Thread-0————true票数150
Thread-0————true票数149
Thread-0————true票数148
Thread-0————true票数147
Thread-0————true票数146
Thread-0————true票数145
Thread-0————true票数144
Thread-0————true票数143
Thread-0————true票数142
Thread-0————true票数141
Thread-0————true票数140
Thread-0————true票数139
Thread-0————true票数138
Thread-0————true票数137
Thread-0————true票数136
Thread-0————true票数135
Thread-0————true票数134
Thread-0————true票数133
Thread-0————true票数132
Thread-0————true票数131
Thread-0————true票数130
Thread-0————true票数129
Thread-0————true票数128
Thread-0————true票数127
Thread-0————true票数126
Thread-0————true票数125
Thread-0————true票数124
Thread-0————true票数123
Thread-0————true票数122
Thread-0————true票数121
Thread-0————true票数120
Thread-0————true票数119
Thread-0————true票数118
Thread-0————true票数117
Thread-0————true票数116
Thread-0————true票数115
Thread-0————true票数114
Thread-0————true票数113
Thread-0————true票数112
Thread-0————true票数111
Thread-0————true票数110
Thread-0————true票数109
Thread-0————true票数108
Thread-0————true票数107
Thread-0————true票数106
Thread-0————true票数105
Thread-0————true票数104
Thread-0————true票数103
Thread-0————true票数102
Thread-0————true票数101
Thread-0————true票数100
Thread-0————true票数99
Thread-0————true票数98
Thread-0————true票数97
Thread-0————true票数96
Thread-0————true票数95
Thread-0————true票数94
Thread-0————true票数93
Thread-0————true票数92
Thread-0————true票数91
Thread-0————true票数90
Thread-0————true票数89
Thread-0————true票数88
Thread-0————true票数87
Thread-0————true票数86
Thread-0————true票数85
Thread-0————true票数84
Thread-0————true票数83
Thread-0————true票数82
Thread-0————true票数81
Thread-0————true票数80
Thread-0————true票数79
Thread-0————true票数78
Thread-0————true票数77
Thread-0————true票数76
Thread-0————true票数75
Thread-0————true票数74
Thread-0————true票数73
Thread-0————true票数72
Thread-0————true票数71
Thread-0————true票数70
Thread-0————true票数69
Thread-0————true票数68
Thread-0————true票数67
Thread-0————true票数66
Thread-0————true票数65
Thread-0————true票数64
Thread-0————true票数63
Thread-0————true票数62
Thread-0————true票数61
Thread-0————true票数60
Thread-0————true票数59
Thread-0————true票数58
Thread-0————true票数57
Thread-0————true票数56
Thread-0————true票数55
Thread-0————true票数54
Thread-1————false票数53
Thread-1————false票数52
Thread-1————false票数51
Thread-1————false票数50
Thread-1————false票数49
Thread-1————false票数48
Thread-1————false票数47
Thread-1————false票数46
Thread-1————false票数45
Thread-1————false票数44
Thread-1————false票数43
Thread-1————false票数42
Thread-1————false票数41
Thread-1————false票数40
Thread-1————false票数39
Thread-1————false票数38
Thread-1————false票数37
Thread-1————false票数36
Thread-1————false票数35
Thread-1————false票数34
Thread-1————false票数33
Thread-1————false票数32
Thread-1————false票数31
Thread-1————false票数30
Thread-1————false票数29
Thread-1————false票数28
Thread-1————false票数27
Thread-1————false票数26
Thread-1————false票数25
Thread-1————false票数24
Thread-1————false票数23
Thread-1————false票数22
Thread-1————false票数21
Thread-1————false票数20
Thread-1————false票数19
Thread-1————false票数18
Thread-1————false票数17
Thread-1————false票数16
Thread-1————false票数15
Thread-1————false票数14
Thread-1————false票数13
Thread-1————false票数12
Thread-1————false票数11
Thread-1————false票数10
Thread-1————false票数9
Thread-1————false票数8
Thread-1————false票数7
Thread-1————false票数6
Thread-1————false票数5
Thread-1————false票数4
Thread-1————false票数3
Thread-1————false票数2
Thread-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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值