找回密码
 FreeOZ用户注册
查看: 1072|回复: 0
打印 上一主题 下一主题

一个有趣的多线程实验程序及其结果

[复制链接]
跳转到指定楼层
1#
发表于 5-8-2009 12:16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
什么也不说了,看程序,然后测试一下:
  1. import java.util.concurrent.atomic.*;
  2. import static java.lang.System.*;

  3. public class T1 implements Runnable {
  4.    private static final AtomicInteger ai = new AtomicInteger();
  5.    private static final ThreadLocal<Integer> v =
  6.         new ThreadLocal<Integer>() {
  7.             public Integer initialValue() {
  8.                 return ai.getAndIncrement();
  9.             }
  10.         };
  11.     private static int lastValue = -1;

  12.     public T1() {
  13.     }

  14.     public void run() {
  15.         v.get(); //initialize thread local value
  16.         doit();
  17.     }

  18.     private synchronized void doit() {
  19.         int x = v.get();
  20.         if(lastValue!=-1 && lastValue != x + 1)
  21.             out.println("last = " + lastValue + ", cur  = " + x);
  22.         lastValue = x;

  23.         //out.println(v.get() + ": start");
  24.         try{ Thread.sleep(1000); } catch(InterruptedException ie){}
  25.         //out.println(v.get() + ": stop");
  26.     }

  27.     public static void main(String [] args){
  28.         Thread[] th = new Thread[1000];
  29.         T1 t1 = new T1();

  30.         for(int k=0; k<th.length; ++k) {
  31.             th[k] = new Thread(t1);
  32.         }

  33.         for(int k=0; k<th.length; ++k) {
  34.             th[k].start();
  35.         }

  36.     }
  37. }
复制代码
在winxp下的某次运行结果是:
  1. $ java T1
  2. last = 0, cur  = 999
  3. last = 999, cur  = 997
  4. last = 997, cur  = 998
  5. last = 998, cur  = 996
  6. last = 890, cur  = 888
  7. last = 888, cur  = 889
  8. last = 889, cur  = 887
  9. last = 817, cur  = 814
  10. last = 814, cur  = 815
  11. last = 815, cur  = 816
  12. last = 816, cur  = 813
  13. last = 805, cur  = 802
  14. last = 802, cur  = 803
  15. last = 803, cur  = 804
  16. last = 804, cur  = 801
  17. last = 793, cur  = 791
  18. last = 791, cur  = 792
  19. last = 792, cur  = 790
  20. last = 727, cur  = 725
  21. last = 725, cur  = 726
  22. last = 726, cur  = 724
  23. last = 672, cur  = 670
  24. last = 670, cur  = 671
  25. last = 671, cur  = 669
  26. last = 659, cur  = 657
  27. last = 657, cur  = 658
  28. last = 658, cur  = 656
  29. last = 532, cur  = 530
  30. last = 530, cur  = 531
  31. last = 531, cur  = 529
  32. last = 479, cur  = 477
  33. last = 477, cur  = 478
  34. last = 478, cur  = 476
  35. last = 398, cur  = 396
  36. last = 396, cur  = 397
  37. last = 397, cur  = 395
  38. last = 329, cur  = 327
  39. last = 327, cur  = 328
  40. last = 328, cur  = 326
  41. last = 321, cur  = 319
  42. last = 319, cur  = 320
  43. last = 320, cur  = 318
  44. last = 254, cur  = 251
  45. last = 251, cur  = 252
  46. last = 252, cur  = 253
  47. last = 253, cur  = 250
  48. last = 215, cur  = 213
  49. last = 213, cur  = 214
  50. last = 214, cur  = 212
  51. last = 201, cur  = 199
  52. last = 199, cur  = 200
  53. last = 200, cur  = 198
  54. last = 198, cur  = 196
  55. last = 196, cur  = 197
  56. last = 197, cur  = 195
  57. last = 171, cur  = 169
  58. last = 169, cur  = 170
  59. last = 170, cur  = 168
  60. last = 93, cur  = 90
  61. last = 90, cur  = 92
  62. last = 91, cur  = 89
  63. last = 63, cur  = 61
  64. last = 61, cur  = 62
  65. last = 62, cur  = 60
  66. last = 42, cur  = 21
  67. last = 21, cur  = 41
  68. last = 22, cur  = 20
  69. last = 12, cur  = 1
  70. last = 1, cur  = 11
复制代码
本实验的结果具有随机性,但从统计的角度来看,Java在线程竞争和执行上有一定的bias
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 2-11-2024 04:23 , Processed in 0.023871 second(s), 16 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表