1、使用DCL双检查锁机制实现多线程环境中的延迟加载单例设计模式
class MyObject{
private volatile static MyObject myObject;
private MyObject(){
}
public static MyObject getInstance(){
try{
if(myObject == null){
//模拟在创建对象之前做的一些准备工作
Thread.sleep(3000);
synchronized(MyObject.class){
if(myObject == null)
myObject = new MyObject();
}
}
}catch(InterruptedException e){
e.printStackTrace();
}
return myObject;
}
}
2、使用静态内置类实现单例模式
class MyObject{
private static class MyObjectHandler {
private static MyObject myObject = new MyObject();
};
private MyObject(){
}
public static MyObject getInstance(){
return MyObjectHandler.myObject;
}
}
3、序列化与反序列化的单例模式实现
静态内置类可以解决线程安全问题,但如果遇到序列化对象时,使用默认的方式运行得到的结果还是多例的,解决的办法是在反序列化中使用readResolve()方法
class MyObject{
private static class MyObjectHandler {
private static MyObject myObject = new MyObject();
};
private MyObject(){
}
public static MyObject getInstance(){
return MyObjectHandler.myObject;
}
protected Object readResolve() throws ObjectStreamException{
return MyObjectHandler.myObject;
}
}
4、使用static代码块实现单例模式
class MyObject{
private static MyObject instance = null;
private MyObject(){
}
static {
instance = new MyObject();
}
public static MyObject getInstance(){
return instance;
}
}
5、使用enum枚举数据类型实现单例模式
枚举enum和静态代码块的特性相似,在使用枚举类时,构造方法会被自动调用。
class MyObject{
public enum MyEnumSingleton{
connectionFactory;
private Connection connection;
private MyEnumSingleton(){
try{
String url = "jdbc:mysql://localhost:3306";
String username = "root";
String password = "123456";
connection = DriverManager.getConnection(url,username,password);
}catch(SQLException e){
e.printStackTrace();
}
}
public Connection getConnection(){
return connection;
}
}
public static Connection getConnection(){
return MyEnumSingleton.connectionFactory.getConnection();
}
}