Java 对于一小段代码,惰性初始化值得吗?
我有单例Java 对于一小段代码,惰性初始化值得吗?,java,memory-management,lazy-initialization,Java,Memory Management,Lazy Initialization,我有单例A.classRunnable loadTask可能会被调用,也可能不会被调用,这就是我考虑延迟初始化的原因。我担心内存的使用。所以问题是,延迟初始化是否值得实现?或者函数体的内存消耗比即时初始化的内存多一点,更容易忽略内存消耗差异 我理解函数的定义必须在某处消耗内存 另外,我知道函数体的内存不是在堆中分配的 p.S.Instrumentation.class、sizeOf、Runtime.freemory()仅适用于类字段/属性 class A_LazyInit { Runna
A.class
Runnable loadTask
可能会被调用,也可能不会被调用,这就是我考虑延迟初始化的原因。我担心内存的使用。所以问题是,延迟初始化是否值得实现?或者函数体的内存消耗比即时初始化的内存多一点,更容易忽略内存消耗差异
我理解函数的定义必须在某处消耗内存
另外,我知道函数体的内存不是在堆中分配的
p.S.Instrumentation.class、sizeOf、Runtime.freemory()仅适用于类字段/属性
class A_LazyInit {
Runnable loadTask;
void load() {
if(loadTask == null) loadTask = new Runnable() {
public void run() {
loadFileFromInternet();
}
};
new Thread(loadTask).start();
}
void useMethod() {
if(isGoodCondition()) load();
}
}
vs
这里的延迟初始化不会节省任何内存。代码的内存将被保留,无论您是否急切地初始化它(它是在类加载时分配的)
由于初始化loadTask变量不会花费很长时间,因此在任何情况下,使用延迟初始化都不会给您带来好处。我将利用类已经被延迟初始化的事实 你可以这么做
enum Singleton {
INSTANCE;
Singleton() {
loadFileFormTheInternet();
}
}
这是线程安全且延迟加载的。延迟初始化之所以值得,有两个原因:1)它适用于仅在相对罕见的情况下使用的数据结构,因此在存储和/或安装成本方面的节约是值得的。2) 您太懒了,无法返回并修改应用程序启动代码,以便在启动时(或在存在允许初始化的环境时)初始化结构。两者都是使用该技术的正当理由。
enum Singleton {
INSTANCE;
Singleton() {
loadFileFormTheInternet();
}
}