饱汉模式
案例一
创建singleton_0包
package singleton_0;
public class MyObject {
//直接new出对象
private static MyObject myObject = new MyObject();
private MyObject(){
}
public static MyObject getInstance(){
return myObject;
}
}
package singleton_0;
public class MyThread extends Thread{
@Override
public void run(){
System.out.println(MyObject.getInstance().hashCode());
}
}
package singleton_0;
public class Run {
public static void main(String[] args) {
//启动五个线程运行
MyThread[] thread = new MyThread[5];
for (int i = 0; i < 5; i++) {
thread[i] = new MyThread();
thread[i].start();
}
}
}
打印出来的五个MyObject实例的哈希码都是相同的。
懒汉模式
案例二
复制singletion_0到singletion_1,修改MyObject.java
package singleton_1;
//懒汉模式单例
public class MyObject {
private static MyObject myObject ;
private MyObject(){
}
//非同步线程不安全
public static MyObject getInstance(){
if(myObject != null){
}else{
myObject = new MyObject();
}
return myObject;
}
}
显然产生了多个对象,下面做出改进,复制singleton_1包,对MyObject做如下改进
案例三 复制singletion_1到singletion_1_1,修改MyObject.java
package singleton_1_1;
public class MyObject {
private static MyObject myObject ;
private MyObject(){
}
//多线程之下容易出现问题,**加上synchronized关键字**,整个方法都上锁了
public synchronized static MyObject getInstance(){
if(myObject != null){
}else{
myObject = new MyObject();
}
return myObject;
}
}
使用DCL双检查机制保证线程安全
package singleton_5;
public class MyObject {
private static MyObject myObject ;
private MyObject(){
}
//DCL双检查锁机制
public static MyObject getInstance(){
try {
synchronized(MyObject.class){
if(myObject != null){
}else{
//模拟创建对象之前做一些准备性的工作
Thread.sleep(3000);
//再次做同步
synchronized(MyObject.class){
if(myObject == null)
myObject = new MyObject();
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return myObject;
}
}
使用内部类实现单例模式
package singleton_7_1;
public class MyObject {
private static class MyObjectHandler{
private static MyObject myObject = new MyObject();
}
private MyObject(){
}
public static MyObject getInstance(){
return MyObjectHandler.myObject;
}
}