上传者: 38748875
|
上传时间: 2026-04-17 09:53:24
|
文件大小: 70KB
|
文件类型: PDF
Java单例模式详解
Java单例模式是Java编程中的一种设计模式,旨在保证一个类仅有一个实例,并提供一个全局访问点。下面我们将对9种Java单例模式进行详细的介绍。
单例模式的特点是:
1. 一个类只允许产生一个实例化对象。
2. 单例类构造方法私有化,不允许外部创建对象。
3. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象。
懒汉式(线程不安全)
懒汉式是单例模式的一种实现方式,其主要特点是单例类在外部需要创建实例化对象时再进行实例化,进而达到Lazy Loading的效果。懒汉式的实现代码如下:
```java
public class Singleton {
private static Singleton singleton;
private Singleton(){ }
public static Singleton singleton(){
if (singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
```
懒汉式的缺点是未考虑到多线程的情况下可能会存在多个访问者同时访问,发生构造出多个对象的问题。
懒汉式(线程安全,同步方法,不推荐使用)
为了解决懒汉式的线程不安全问题,可以对getSingleton()方法进行同步加锁。但是,这种方法的缺点是效率低,大多数情况下这个锁占用的额外资源都浪费了,每个线程在想获得类的实例时候,执行getSingleton()方法都要进行同步。
```java
public class Singleton {
private static Singleton singleton;
private Singleton(){ }
public static synchronized Singleton singleton(){
if (singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
```
饿汉式(线程安全)
饿汉式是单例模式的一种实现方式,其特点是在类加载时完成实例化对象的过程。饿汉式避免了线程同步问题,但是缺点是相比接下来的静态内部类而言,这种方法比静态内部类多了内存常驻,容易造成内存浪费,也未达到延迟加载的效果。
```java
public class Singleton{
private static Singleton singleton = new Singleton();
private Singleton(){ }
public static Singleton singleton(){
return singleton;
}
}
```
静态内部类加载(线程安全)
静态内部类加载是单例模式的一种实现方式,其特点是静态内部类不会在单例加载时加载,当调用getSingleton()方法时才会进行加载,达到类似懒汉式效果,并且也是线程安全的。
```java
public class Singleton{
private static Singleton singleton;
private static class SingletonInner{
private static final Singleton instance = new Singleton();
}
public static Singleton getSingleton(){
return SingletonInner.instance;
}
}
```
枚举(线程安全)
枚举是Java单例模式的一种实现方式,其特点是自由串行化;保证只有一个实例;线程安全。Effective Java作者所提倡的方法,近乎完美,在继承场景下不适用。
```java
public enum Singleton {
INSTANCE;
}
```
Java单例模式有多种实现方式,每种方式都有其优缺点,选择哪种方式取决于实际需求和场景。