iteye_12401 2011-09-16 14:31
浏览 205
已采纳

Java对象奇异现象,求解

[code="java"]
public static void main(String[] args) {
Integer count = new Integer(0);
new SendThread(count).start();
new SendThread(count).start();
new SendThread(count).start();
new SendThread(count).start();
new SendThread(count).start();
}
[/code]

[code="java"]
public class SendThread extends Thread {
public Integer count = 0;
public SendThread(Integer count) {
this.count = count;
}

@Override
public void run() {
    while (true) {
            synchronized(count){
                    count++;
                    System.out.println(getName()+ ",number:"+count);
            }

            try {
                Thread.sleep(10);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
      }
}

}
[/code]
运行结果如下:

Thread-1,number:1
Thread-3,number:1
Thread-0,number:1
Thread-2,number:1
Thread-4,number:1
Thread-0,number:2
Thread-1,number:2
Thread-2,number:2
Thread-3,number:2
Thread-4,number:2
Thread-0,number:3
Thread-4,number:3
Thread-2,number:3
Thread-3,number:3
Thread-1,number:3


Integer不是对象吗?那这5个线程,不是都是同一个对象上进行累加吗?为什么每个线程打印出来的值都是从1开始呢?

这到底是为什么呢为什么呢?

  • 写回答

15条回答 默认 最新

  • _1_1_7_ 2011-09-16 16:16
    关注

    为了说明问题,稍微改了一下代码
    [code="java"]

    public class IntegerTest {
    static Integer count = new Integer(0);

    public static void main(String[] args) {
    
        new SendThread(count).start();
        new SendThread(count).start();
        new SendThread(count).start();
    }
    
    static class SendThread extends Thread {
        public Integer count1;
    
        public SendThread(Integer count) {
            //count1指向count
            this.count1 = count;
        }
    
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                synchronized (count1) {
                    //count1自加,新的对象,count不变(不可变对象)
                    count1++;
                    if (count1 == count)
                        System.out.println("你在做梦");
                    System.out.println(getName() + ",number:" + count1);
                }
    
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    }
    [/code]

    对比String\BigDecimal\BigInteger之类,都是Immutable

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(14条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题