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