单例模式(Singleton)的同步锁synchronized
单例模式,有“懒汉式”和“饿汉式”两种。
懒汉式
单例类的实例在第⼀次被引⽤时候才被初始化。
public class Singleton {
private static Singleton instance=null;
private Singleton() {
}
public static Singleton getInstance(){
if (instance == null) {
instance = new Singleton();
}
return instance;
java单例模式懒汉和饿汉}
}
饿汉式
单例类的实例在加载的时候就被初始化。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance(){
return instance;
}
}
在单线程程序中,上⾯两种形式基本可以满⾜要求了,但是在多线程环境下,单例类就有可能会失效,这个时候就要对其加锁了,来确保线程安全。
对线程加锁⽤的synchronized关键字,这个关键字的⽤法主要也分为两种:
⼀种是加在⽅法名之前,形如:synchronized methodeName(params){……};
⼆是声明同步块,形如:synchronized(this){……};
下⾯是对懒汉式单例类加上线程同步的实现:
同步⽅法:
public class Singleton {
private static Singleton instance=null;
private Singleton() {
}
public synchronized static Singleton getInstance(){
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种⽅式效率⽐较低,性能不是太好,不过也可以⽤,因为是对整个⽅法加上了线程同步,其实只要在new的时候考虑线程同步就⾏了,这种⽅法不推荐使⽤。
同步代码块:
public class Singleton {
private static Singleton instance;
private final static Object syncLock = new Object();
private Singleton() {
}
public static Singleton getInstance(){
if (instance == null) {
synchronized (syncLock) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
synchronized同步块括号中的锁定对象是采⽤的⼀个⽆关的Object类实例,⽽不是采⽤this,因为getInstance是⼀个静态⽅法,在它内部不能使⽤未静态的或者未实例的类对象,因此也可以⽤下⾯的⽅法来实现:
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance(){
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论