Java代码如下,问一下,running的话,这样可以进行同步吗?现在的情况是,在SMP环境下,有时running的值不会减到0,在synchronized (running)里面打印出两个一样的running值。public class Spider implements Runnable { private Integer totalThread = 5; private Integer running = 0; public void start() {
  quit = false;  for (int i = 0; i < totalThread; i++) {
   Thread t = new Thread(this, "Spider-Thread-" + (i + 1));
   t.start();
   synchronized (running) {
    running++;
   }  } } public boolean isRunning() {
  boolean r = true;
  synchronized (running) {
   r = ( running != 0);
  }
  return r;
 } public void run() {   try {       //DO Somethingthing   } catch (Exception ex) {
    ex.printStackTrace();
   }    System.out.println("Over");
  synchronized (running) {
   running--;
    System.out.println("R" + running);  }
 }}

解决方案 »

  1.   

    不会同步。楼主不如自己编写一个线程管理器,之类的东西,来分配线程资源。楼主对synchronized的理解,好象并不深刻,这个锁是多个线程所访问的共同对象才可以。
    但是,对于Integer对象,每个值是否对应的是同一个对象,我们这里都有待讨论的。
      

  2.   

    正如2楼所说,Integer和String对象一样,每次修改实际都是指向一个新的对象
      

  3.   

    是不是可以这么理解,就是Integer对象的值修改后,可能指向原来的地址,也可能指向一个新的地址?
    如果是这样的话,这段代码是有问题。
      

  4.   

    恩,可以这么理解。不过这个涉及到Integer pool了。
    大体的意思是当Integer i中i的范围是-127--+128时,i引用所指向的对象存储于pool之中,所以会有
    Integer i1=new Integer(120);Integer i2=new Integer(120); i1==i2为true的古怪,若i在该范围之
    外,那么它就存储于堆栈之中,Integer i3=new Integer(200);Integer i4=new Integer(200);
    i3==i4为false;具体就不深入了,自己找下帖子。