打字猴:1.700449839e+09
1700449839
1700449840 a—;
1700449841
1700449842 String tn=Thread.currentThread().getName();
1700449843
1700449844 System.out.println(tn+”:a=”+a);
1700449845
1700449846 }
1700449847
1700449848 }
1700449849
1700449850 }
1700449851
1700449852 MultiThread实现了Runnable接口,具备多线程能力,其中run方法中加上了synchronized代码块,表示内部是原子逻辑,它会先自增然后再自减少,按照synchronized同步代码块的规则来处理,此时无论启动多少个线程,打印出来的结果都应该是a=0,但是如果有一个正在执行的线程被stop,就会破坏这种原子逻辑,代码如下:
1700449853
1700449854 public static void main(String[]args){
1700449855
1700449856 MultiThread t=new MultiThread();
1700449857
1700449858 Thread t1=new Thread(t);
1700449859
1700449860 //启动t1线程
1700449861
1700449862 t1.start();
1700449863
1700449864 for(int i=0;i<5;i++){
1700449865
1700449866 new Thread(t).start();
1700449867
1700449868 }
1700449869
1700449870 //停止t1线程
1700449871
1700449872 t1.stop();
1700449873
1700449874 }
1700449875
1700449876 首先要说明的是所有线程共享了一个MultiThread的实例变量t,其次由于在run方法中加入了同步代码块,所以只能有一个线程进入到synchronized块中。此段代码的执行顺序如下:
1700449877
1700449878 1)线程t1启动,并执行run方法,由于没有其他线程持同步代码块的锁,所以t1线程执行自加后执行到sleep方法即开始休眠,此时a=1。
1700449879
1700449880 2)JVM又启动了5个线程,也同时运行run方法,由于synchronized关键字的阻塞作用,这5个线程不能执行自增和自减操作,等待t1线程锁释放。
1700449881
1700449882 3)主线程执行了t1.stop方法,终止了t1线程,注意,由于a变量是所有线程共享的,所以其他5个线程获得的a变量也是1。
1700449883
1700449884 4)其他5个线程依次获得CPU执行机会,打印出a值。
1700449885
1700449886 分析了这么多,相信读者也明白了输出的结果,结果如下:
1700449887
1700449888 Thread-5:a=1
[ 上一页 ]  [ :1.700449839e+09 ]  [ 下一页 ]