Java中对线程间的变量访问也需要同步控制

来源:java认证发布时间:2012-11-12 13:12:24java认证视频

  一个简单的计数器,本来以为不需要同步保护,后来发现不行,还是得加上。程序:

  public class TestMain {

  int i = 0; //计数器初始值为0

  public static void main(String[] args) {

  TestMain c = new TestMain();

  Worker x = new Worker(c);

  for (int i=0; i<200; i++) { //200个线程

  new Thread(x).start();

  }

  while (true) { //每隔一秒中输出计数器的值

  System.out.println(c.i);

  try {

  Thread.sleep(1000);

  } catch (InterruptedException e) {

  }

  }

  }

  }

  class Worker implements Runnable {

  TestMain c;

  public Worker(TestMain c) {

  this.c = c;

  }

  public void run() {

  try {

  Thread.sleep((int)(Math.random() * 25)); //随机Sleep一段时间

  } catch (InterruptedException e) {

  }

  c.i++; //计数器自增 问题在这里 并发写入

  }

  }

  上面的程序50%的几率结果是200,其余的是199,198....

  c.i++一句需要并发保护。

  本来我以为Java里面++是原子的呢,呵呵。

  解决方法,加上同步控制,或者使用JDK5里面新增加的AtomicInteger类。

  编辑特别推荐:

  Java数组与容器类分析资料

  Java获取下拉菜单选中的选项

  “Scala”一个有趣的语言

  JAVA的J2SE处理编码解码写法

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答