1.对象初始化过程:(先加载类到内存,然后加载类属性,成员方法)
定义一个类Person, 在new Person("zhangsan",20); 初始化过程:
- 因为new 用到Person.class文件,所以会先找到Person.class文件并加载到内存中.
- 执行该类中的static静态代码块,如果有的话,给Person.class类进行初始化.
- 在对内存中开辟空间,分配内存地址.
4.在对内存中建立对象的特有属性,并进行默认初始化.
5.对属性进行显示初始化.
6.对对象进行对应的构造代码块初始化.
7.对对象中构造函数进行初始化.,
8.将内存地址付给栈内存中的p变量.
注意: 静态只能在栈内存里,非静态变量在堆里.
2.单例设计模式:解决一个类在内存中只存在一个对象(保证对象唯一).
1.禁止其他程序建立该类对象.
2.在本类自定义一个对象.
3.为了提供其他程序使用该类对象,对外提供一些访问方法.
解决问题:
1.将构造函数私有化.(私有化无参构造函数,这样外界就不能直接访问该类对象.)
2.在类中创建一个本类对象.(静态类)
3.提供一个方法可以获取到该对象(静态方法).
懒汉模式
关键点:
1)构造函数定义为私有----不能在别的类中来获取该类的对象,只能在类自身中得到自己的对象
2)成员变量为static的,没有初始化----类加载快,但访问类的唯一实例慢,static保证在自身类中获取自身对象
3)公开访问点getInstance: public和synchronized的-----public保证对外公开,同步保证多线程时的正确性(因为类变量不是在加载时初始化的)
饿汉模式
关键点:
1)私有构造函数
2)静态私有成员--在类加载时已初始化
3)公开访问点getInstance-----不需要同步,因为在类加载时已经初始化完毕,也不需要判断null,直接返回
懒汉式的优点是延时加载、缺点是应该用同步、其实也可以不用同步、看你的需求了,多创建一两个无引用的废对象其实也没什么大不了。
单例中懒汉和饿汉的本质区别在于以下几点:
1、饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。
2、从实现方式来讲他们最大的区别就是懒汉式是延时加载,他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,饿汉式无需关注多线程问题、写法简单明了、能用则用。但是它是加载类时创建实例、所以如果是一个工厂模式、缓存了很多实例、那么就得考虑效率问题,因为这个类一加载则把所有实例不管用不用一块创建。
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。这两个模式区别在于需要创建对象的复杂程度上。
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。线程安全问题都是由全局变量及静态变量引起的。
单利模式呢 就是永远保持一个对象,懒汉模式在运行的时候 获取对象比较慢,但是加载类的时候比较快,但是饿汉模式是在运行的时候获取对象较快,加载类的时候慢。
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例