比如我一个程序里有30个类
1程序运行时候,虚拟机是一下把30类都加载还是用哪个类加载哪个类?
2类里有属性和方法,那加载某个类的时候,是把该类里的所有属性和方法都加载,还是根据我调用该类的哪个方法就加载哪个方法,,其它没用到的方法并不加载?
下面这俩句话
懒汉式是,只有用到这个用例的时候,再将他实例化,不会浪费,所以效率要高一些。
饿汉式则是程序只要开始,就将他实例化,到用到他的时候就省去了再实例的时间,所以速度和反应快。
什么叫程序开始?难道说程序一运行就把所有类都加载了吗?不是说用到那个类才加载哪个类吗?请解释下咋回事
那是不是说实例化的时候,这个类的属性和方法都会加载到内存?
比如我只new A了但是我没调用任何属性和方法,那请问这个类里面的属性和方法是否已经全被加载到内存里了?即使我没有调用这个类里面的属性和方法,但是我只实例化了而已
在你实例化的时候就已经加载到内存里,并给你的属性分配空间,分配大小按照属性类型来分,这个和你调不调用没有关系,这个java机制就是这样的。
在你实例化的时候就已经加载到内存里,并给你的属性分配空间,分配大小按照属性类型来分,这个和你调不调用没有关系,这个java机制就是这样的。
追问原来如此,对了,那在请教下,懒汉和饿汉,如果不考虑线程安全的情况下,这俩有什么区别?因为我知道一个是类加载时候实例化,一个是调用方法里实例化,但是最后都是实例化了,我感觉不到区别?这个怎么破。。
追答懒汉式加载是以牺牲时间换取内存空间(减少内存空间的占用),饿汉式是以牺牲内存空间来换取时间(节约时间),程序设计中时间和空间是不可能兼得的,只能在他们中间平衡选取。
追问你说的是多个单例的时候存在这种情况,如果我说如果就只有一个单例,懒汉和饿汉就不存在这种情况吧?因为如果只有一个单例,加载时候实例和调用方法时候实例感觉不出太大的区别。
只是加载的时机不同而已,但是结果都是创建出实例对象。
如果是单例的情况,他们主要区别有:
1、饿汉式加载是第一次实例化得时候就会创建一个static的实例,线程安全,但有可能造成内存的浪费。
2、懒汉式加载会在需要用到这个实例的时候才实例化,如果是单例一般会加一个if语句判断是否为空if(a = =null)再创建实例,这时候就会出现线程不安全的情况。所以为防止线程不安全会加锁,但是这样会造成程序执行的效率下降。
一般推荐饿汉式加载的方式。
那都判断a==null 还要加锁吗?如果不为空 就返回实例对象就行了 既然判断了 还会出现线程不安全吗?
追答是的要加锁,因为如果多个线程同时进入时(在对象还没有创建完成),就会同时出现这几个线程同时判别为空,就会每个线程都创建实例a,所以出现线程不安全。