Java静态变量更新

Java静态变量更新,java,static,static-members,Java,Static,Static Members,下面可以看到Java类中的静态变量计数器 问题是这个变量何时重置?例如,当我重新启动程序时,计算机。它还可以重置哪些其他可能的场景 另一个问题是:这个变量增加的次数少于函数do()的执行次数的原因是什么?例如,是否可以启动类java的多个进程?或者可能是有多个线程/服务器的东西,等等 class Whatever { static int counter = 0; function do() { counter++; //... }

下面可以看到Java类中的静态变量
计数器

问题是这个变量何时重置?例如,当我重新启动程序时,计算机。它还可以重置哪些其他可能的场景

另一个问题是:这个变量增加的次数少于函数do()的执行次数的原因是什么?例如,是否可以启动类
java的多个进程?或者可能是有多个线程/服务器的东西,等等

class Whatever {

    static int counter = 0;

    function do() {
        counter++;
        //...
    }

}

附加问题:如果多个线程执行函数do(),计数器变量将如何工作?它将少于函数do()的执行次数?

重新启动应用程序时,静态变量将被重新初始化。

根据:

如果一个字段被声明为静态的,那么不管最终创建了多少个类实例(可能为零),该字段只存在一个化身。静态字段(有时称为类变量)在初始化类时具体化

这就回答了你的第一个问题。i、 e.e类加载的确切时间:)

根据第二个问题,没有。如果变量声明为private。由于封装的原因,只能通过方法进行访问

静态变量一直持续到JVM关闭。

1)加载类时设置(重置)变量。除了关闭JVM之外,一些服务器在不同的应用程序(例如Tomcat webapps)中加载该类,其中一些服务器允许重新启动它们


2) 线程的并发修改。但它应该是罕见的,除非你经常使用它。对函数/块使用
synchronized

计数器
不是专用变量。因此,该值可能被其他类更改

每当您的程序(特别是容器/jvm)被重述时,这个变量就会被重置

问题是这个变量何时重置

可以使用自定义的
reset()
方法重置静态变量。若你们说重新启动程序,理论上那个变量将被初始化为它的值,而不是重新初始化,因为它不一样(你们重新启动程序)。

class Foo{//in the same package
公共静态void main(字符串[]args){
Whatever w=新的Whatever();
对于(int i=0;i<1000;i++){
w、 do();
}
Whatever.counter=-1;
}
这里调用了1000次
do()
,但是
计数器将在末尾有值


我在示例中使用了与您类似的
do()
,但请注意,不是有效的方法名,因为它是do while循环的关键字。

静态变量意味着在程序执行过程中该字段只有一个化身。初始化类时加载它

对于第二个问题,您的变量不是线程安全的,因为多个线程可以同时访问它。 即使您的计数器是不稳定的,您仍然会面临并发问题。 根据您的示例和要求,您有三种选择:

如果您的唯一需求是操作变量,而代码的其余部分不依赖于此,则可以使用synchronize(用大炮杀死苍蝇)或(性能更好的选择):

如果其余代码依赖于计数器,则必须使用锁定对象或同步方法:

class Whatever {

    static int counter = 0;

    synchronize function do() {
        counter++;
        if(counter < 10){
            //  do something
        }
    }
}

//  or

class Whatever {

    static int counter = 0;
    static final Object _lock = new Object();

    function do() {
        synchronized (_lock) {
            counter++;
            if(counter < 10){
                //  do something
            }
        }
    }
}
class无论什么{
静态整数计数器=0;
同步函数do(){
计数器++;
如果(计数器<10){
//做点什么
}
}
}
//或
什么课都行{
静态整数计数器=0;
静态最终对象_lock=新对象();
函数do(){
已同步(_锁){
计数器++;
如果(计数器<10){
//做点什么
}
}
}
}

这是我现在脑海中的选项,但可能还有更多。

静态
变量只在程序开始执行时初始化一次。您的
计数器
是包私有的,因此同一包中的任何类都可以为其分配任意值。顺便说一句,
do
是保留关键字d不能用作方法名。如果多个线程访问它,计数器变量bahave将如何使用?它将小于函数do()的次数已执行?是。假设
计数器
为2;
线程1
执行该操作,以计算++检索2并添加3,但在将2替换为3之前
线程2
开始该操作,检索
计数器
仍然为2,并将结果计算为3。最后,两个线程都将设置
计数器
设置为3,而其中一个计数器应将其设置为4。这称为并发或运行条件。
static synchronize int counter = 0;
// or
static AtomicInteger counter = new AtomicInteger();
class Whatever {

    static int counter = 0;

    synchronize function do() {
        counter++;
        if(counter < 10){
            //  do something
        }
    }
}

//  or

class Whatever {

    static int counter = 0;
    static final Object _lock = new Object();

    function do() {
        synchronized (_lock) {
            counter++;
            if(counter < 10){
                //  do something
            }
        }
    }
}