Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中用于同步的全局变量_Java_Global Variables_Thread Synchronization - Fatal编程技术网

Java中用于同步的全局变量

Java中用于同步的全局变量,java,global-variables,thread-synchronization,Java,Global Variables,Thread Synchronization,我写的是JAVA中多人睡眠理发师问题的一个变体,每个顾客都有等待理发师的时间和理发的具体时间,此外,除了在没有顾客时睡觉之外,每个理发师在特定时间内为一定数量的顾客理发后睡觉 由于变化,我觉得需要一个全局变量来跟踪时间 我的问题是,如果我使用带有静态字段的全局类来跟踪时间,我会遇到任何问题吗?我已经读到,如果我的全局类变为“unload”,那么该值将变为null;这是什么时候发生的,在我的情况下会成为一个问题吗?如果是,我还有什么其他选择 (我将在扩展Thread的主类中的“while”循环中增

我写的是JAVA中多人睡眠理发师问题的一个变体,每个顾客都有等待理发师的时间和理发的具体时间,此外,除了在没有顾客时睡觉之外,每个理发师在特定时间内为一定数量的顾客理发后睡觉

由于变化,我觉得需要一个全局变量来跟踪时间

我的问题是,如果我使用带有静态字段的全局类来跟踪时间,我会遇到任何问题吗?我已经读到,如果我的全局类变为“unload”,那么该值将变为null;这是什么时候发生的,在我的情况下会成为一个问题吗?如果是,我还有什么其他选择


(我将在扩展Thread的主类中的“while”循环中增加时间,同时扩展Thread的Customer和Barber类只需阅读即可。)

这里有一个类似的问题:。 根据JLS 12.4.1,在下列事件之一发生后,将初始化class静态变量:

  • 将创建该类的一个实例
  • 调用该类的静态方法
  • 指定了类的静态字段
  • 使用非恒定静态场,或
  • 对于顶级类,执行词汇嵌套在类中的assert语句
所以在你的例子中,我想你需要确保你的全局时间变量在进入while循环之前通过一个简单的赋值,比如

public class Global {
  public static int time;
}

public class MultipleSleepingBarber implements Runnable {

  public void run() {
    Global.time = Global.time + 1;
    System.out.println("Time is " + Global.time);
  }

  public static void main(String args[]) {
    Global.time = 0;
    for (int i = 0; i < 10; i++)
      (new Thread(new MultipleSleepingBarber())).start();
  }

}
公共类全局{
公共静态整数时间;
}
公共类MultipleSleepingBarber实现Runnable{
公开募捐{
Global.time=Global.time+1;
System.out.println(“时间是”+全局时间);
}
公共静态void main(字符串参数[]){
全局时间=0;
对于(int i=0;i<10;i++)
(新线程(新的MultipleSleepingBarber()).start();
}
}
“如果我的全局类变为“已卸载”,则除非您自己或依赖于可能执行此操作的框架,否则不会发生”。换句话说,如果你不做任何特别的事情,并且用java-jar正常运行你的应用程序,你会没事的。