单例模式
方式一:饿汉式
package com.itweiting.staticdemo;
/**
* 单例模式
* 饿汉式
* @author Administrator
*/
public class SingletonTest1 {
public static void main(String[] args) {
Bank bank=Bank.getInstance();
Bank bank1=Bank.getInstance();
System.out.println(bank==bank1);//打印结果为true,
}
}
class Bank{
//要求私有化类的构造器,类外不能造对象
private Bank() {
}
//类部创建类的对象,要求此对象必须声明为静态的
private static Bank instance =new Bank();
//提供公共的方法返回类的对象
public static Bank getInstance() {
return instance;
}
}
好处:满足线程安全
方式二:懒汉式
package com.itweiting.staticdemo;
public class SingletonTest2 {
public static void main(String[] args) {
Order order=Order.getInstance();
Order order2=Order.getInstance();
System.out.println(order==order2); //打印结果为:true
}
}
class Order{
//私有化类的构造器
private Order() {
}
//声明当前类的对象
private static Order instance=null;
//声明public ,static的返回当前类对象的方法
public static Order getInstance() {
if(instance==null) { //判断是否是对象,如果是对象,直接返回instance,如果不是创建对象
instance=new Order();
}
return instance;
}
}
好处:减少内存的加载
3.懒汉式线程安全解决办法
方法一;
class Order{
//私有化类的构造器
private Order(){
}
//声明当前类的对象
private static Order instance=null;
//声明public,static的返回当前对象的方法
public static synchronized Order getInstance() { //直接加synchronized,效率比较差
if (instance==null){
instance=new Order();
}
return instance;
}
}
public class SingtonDemoSafey {
public static void main(String[] args) {
Order order=Order.getInstance();
Order order1=Order.getInstance();
System.out.println(order==order1);
}
}
方法二:
class Order {
//私有化类的构造器
private Order() {
}
//声明当前类的对象
private static Order instance = null;
//声明public,static的返回当前对象的方法
public static Order getInstance() {
if (instance == null) {
synchronized (Order.class) {
if (instance == null) {
instance = new Order();
}
return instance;
}
}
return instance;
}
}
public class SingtonDemoSafey {
public static void main(String[] args) {
Order order=Order.getInstance();
Order order1=Order.getInstance();
System.out.println(order==order1);
}
}