一般来说,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
答案 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())