2

一般java开发者都知道必须使用“同步”来一一控制方法的执行,但是我看到下面的代码选择了静态变量来控制,无法模拟条件来证明方法是错误的,如何修改代码以输出超过1000的值?

public class ThreadJunk implements Runnable{
    private Info info;
    public ThreadJunk(Info info) {
        this.info = info;
    }
    public static void main(String args[]) throws Exception {

        for(int j=0;j<100;j++) {
            Info ii = new Info();
            for(int i=0;i<1000;i++) {
                Thread t = new Thread(new ThreadJunk(ii));
                t.start();
            }
            System.out.println(ii.getValue());
        }
    }
    @Override
    public void run() {
        info.addValue();
    }
}

class Info {
    public static boolean IS_LOCKED = false;
    private int value = 0;
    public void addValue() {
        if(IS_LOCKED)
            return;
        IS_LOCKED = true;
        value++;
        IS_LOCKED = false;
    }
    public int getValue() {
        return value;
    }
}

在我的电脑上,我从来没有得到超过 1000 的结果

4

2 回答 2

2

查看代码的这一部分:

Info ii = new Info();
for (int i = 0; i < 1000; i++) {
    Thread t = new Thread(new ThreadJunk(ii));
    t.start();
}

对于每个Info对象,您创建的只是1000线程。您不应该期望该value字段会增加1000多次。

于 2013-02-26T09:58:07.620 回答
0

Info对象value作为成员变量。根据您的线程创建逻辑,一个 Info 对象在 999 个线程中共享。

 for(int j=0;j<100;j++) {
            Info ii = new Info();
            for(int i=0;i<1000;i++) {
                Thread t = new Thread(new ThreadJunk(ii));
                t.start();
            }
            System.out.println(ii.getValue());
        }

因此,显然跟随永远不会大于 1000。

System.out.println(ii.getValue())
于 2013-02-26T10:03:06.520 回答