其中包括单线程下的单例模式的两种:懒汉式,饿汉式,以及多线程下的单例模式。
package com.dream.test02;
public class Test01 {
//多线程下的单例模式:线程安全,节省资源
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i = 0; i<2; i++){
//创建两个线程
//ps:创建线程还不简单,new一个Thread就行了
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(MyClass.getInstance());
}
}).start();
}
}
}
//单例模式
//饿汉式
//class MyClass{
// //线程安全,但是浪费资源
// private MyClass(){}
// static MyClass my = new MyClass();
//
// //目的:外界多次申请也只能获得一个对象。
// //在加上用static修饰,大家都共享这一个对象。
// //只要外界有一个地方改变了该对象,可以影响到每一个使用该对象的地方
// static public MyClass getInstance(){
// return my;
// }
//
//
//}
//懒汉式
//class MyClass{
// //需要时才创建对象,而且只能创建一次,且该对象也应该用static修饰
// private static MyClass my = null;
// private MyClass(){}
//
// public static MyClass getInstance(){
// //节省资源,但是线程不安全
// //假设有两个进程在新对象创立前都冲进了这个if中,则会创建两个不同的对象
// if(my == null){
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName()+"new 了");
// my = new MyClass();
// }
// return my;
// }
//
//
//}
//多线程下的单例模式
class MyClass{
//既线程安全,有节省资源
private static MyClass my = null;
private MyClass(){}
public static MyClass getInstance(){
//重点在于将if语句加锁,每次只能一个进程进入if语句
synchronized("love"){
if(my == null){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
my = new MyClass();
}
}
return my;
}
}