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); }
}}
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); }
}}
但是,对于Integer对象,每个值是否对应的是同一个对象,我们这里都有待讨论的。
如果是这样的话,这段代码是有问题。
大体的意思是当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;具体就不深入了,自己找下帖子。