打字猴:1.700450309e+09
1700450309
1700450310 }
1700450311
1700450312 }
1700450313
1700450314 上面的代码定义了一个多线程类,run方法的主要逻辑是共享资源count的自加运算,而且我们还为count变量加上了volatile关键字,确保是从主内存中读取和写入的,如果有多个线程运行,也就是多个线程执行count变量的自加动作,count变量会产生脏数据吗?想想看,我们已经为count加上了volatile关键字呀!模拟多线程的代码如下:
1700450315
1700450316 public static void main(String[]args)throws Exception{
1700450317
1700450318 //理想值,并作为最大循环次数
1700450319
1700450320 int value=1000;
1700450321
1700450322 //循环次数,防止出现无限循环造成死机情况
1700450323
1700450324 int loops=0;
1700450325
1700450326 //主线程组,用于估计活动线程数
1700450327
1700450328 ThreadGroup tg=Thread.currentThread().getThreadGroup();
1700450329
1700450330 while(loops++<value){
1700450331
1700450332 //共享资源清零
1700450333
1700450334 UnsafeThread ut=new UnsafeThread();
1700450335
1700450336 for(int i=0;i<value;i++){
1700450337
1700450338 new Thread(ut).start();
1700450339
1700450340 }
1700450341
1700450342 //先等15毫秒,等待活动线程数量成为1
1700450343
1700450344 do{
1700450345
1700450346 Thread.sleep(15);
1700450347
1700450348 }while(tg.activeCount()!=1);
1700450349
1700450350 //检查实际值与理论值是否一致
1700450351
1700450352 if(ut.getCount()!=value){
1700450353
1700450354 //出现线程不安全的情况
1700450355
1700450356 System.out.println(“循环到第”+loops+“遍,出现线程不安全情况”);
1700450357
1700450358 System.out.println(“此时,count=”+ut.getCount());
[ 上一页 ]  [ :1.700450309e+09 ]  [ 下一页 ]