如何证明使用静态变量是一个巨大的错误?

时间:2013-02-26 09:48:00

标签: java multithreading

一般来说,java开发人员都知道我们必须使用“synchronized”来逐个控制方法执行,但是我看到下面的代码选择静态变量来控制,而我无法模拟条件来证明方法是错误的,如何修改代码输出的值超过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

2 个答案:

答案 0 :(得分: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次。

答案 1 :(得分:0)

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

 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())