public class TestSynconnized {
int a ;
private Object object = new Object();
private volatile Integer i = 0;
public void Add()
{synchronized(i)
{
System.out.println("++i="+(++i)+Thread.currentThread().getName());;
}
}
public static void main(String args[])
{
TestSynconnized testSynconnized = new TestSynconnized();
for(int i =0;i<20;i++)
{
Thread thread = new Thread(new Runnable() {
public void run() {
for(int i =0;i<1000;i++)
testSynconnized.Add();
}
});
thread.start();
}
while(Thread.activeCount()>1)
Thread.yield(); System.out.println(testSynconnized.i);
}
}给 integer i加了同步和volatile 为什么最后输出的值还会少于20000呢大神们解释下
解决方案 »
- 请教 j2se打印传真纸的打印代码
- 不显示删除回复显示所有回复显示星级回复显示得分回复 请教各位大侠:swing中的怎样将一个主页面的消息传送到子页面中
- 怎么才可以选中JTextPane中插入的ImageIcon,可以拉伸改变其大小?
- 如何获取JTree某一个节点是不是处在编辑状态?
- think in java
- 我想同时学C++和JAVA,不知可不可以?
- 请教一个JAVA连接数据库的问题,请个位高手指点指点
- applet从服务器硬盘读数字(dat),怎样做到applet一次载入不动态随文件改变而改变?(换个问发)
- 关闭窗口问题~``
- 请教哪里有jrun下载?
- 关于Tree的问题
- 求高手点拨一个:“Java Swing的皮肤包的修改”“所需要阅读的指导教程”。
如:
private String t="xcc";
public void Add() {
synchronized (t) {
System.out.println("++i=" + (++i)+ Thread.currentThread().getName());
}
}
原因很简单,因为你的i每调用一个线程都会被重新赋于另一个值,这样synchronized(i)中的这个i就不是一个同一个对象了,所以会发生错乱