一个简单的计数器,本来以为不需要同步保护,后来发现不行,还是得加上。程序:
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处理编码解码写法
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。