【CSDN常见问题解答】Java单例模式分析
2012-11-02 13:02
417 查看
今天中午闲着没事,就随便写点关于Java单例模式的。其实单例模式实现有很多方法,这里我将对这些方法进行对比分析:
第一种:
public class Singleton2 {
private Singleton2(){
System.out.println("This is Singleton2's instance.");
};
private static Singleton2 instance = null;
public static Singleton2 getInstance(){
if(instance == null) {
instance = new Singleton2();
}
return instance;
}
}
这种情况未加锁,可能会产生数据错误,比如两个同时新生成的对象,一个把对象数据改变了,而另一个使用的没改变之前的。
第二种:
public class Singleton1 {
private Singleton1(){
System.out.println("This is Singleton1's instance.");
}
private static Singleton1 instance = null;
public static Singleton1 getInstance2() {
if(instance == null){ //1
synchronized (Singleton1.class) { //2
if(instance == null) {
instance = new Singleton1();
}
}
}
return instance;
}
}
这种只会在第一次的时候产生阻塞,之后每实例一次对象,就会在第1步时跳过去,在第一次实例的时候,会在第2步那里产生阻塞,以后就不会了,这种相对来说是最好的。
第三种:
public class Singleton1 {
private Singleton1(){
System.out.println("This is Singleton1's instance.");
}
private static Singleton1 instance = null;
public static synchronized Singleton1 getInstance(){ //1
if(instance == null){
instance = new Singleton1();
}
return instance;
}
}
多线程的时候每次都会在1这里产生阻塞。
第一种:
public class Singleton2 {
private Singleton2(){
System.out.println("This is Singleton2's instance.");
};
private static Singleton2 instance = null;
public static Singleton2 getInstance(){
if(instance == null) {
instance = new Singleton2();
}
return instance;
}
}
这种情况未加锁,可能会产生数据错误,比如两个同时新生成的对象,一个把对象数据改变了,而另一个使用的没改变之前的。
第二种:
public class Singleton1 {
private Singleton1(){
System.out.println("This is Singleton1's instance.");
}
private static Singleton1 instance = null;
public static Singleton1 getInstance2() {
if(instance == null){ //1
synchronized (Singleton1.class) { //2
if(instance == null) {
instance = new Singleton1();
}
}
}
return instance;
}
}
这种只会在第一次的时候产生阻塞,之后每实例一次对象,就会在第1步时跳过去,在第一次实例的时候,会在第2步那里产生阻塞,以后就不会了,这种相对来说是最好的。
第三种:
public class Singleton1 {
private Singleton1(){
System.out.println("This is Singleton1's instance.");
}
private static Singleton1 instance = null;
public static synchronized Singleton1 getInstance(){ //1
if(instance == null){
instance = new Singleton1();
}
return instance;
}
}
多线程的时候每次都会在1这里产生阻塞。
相关文章推荐
- CityEngine开发竞赛-作品常见问题分析及解答
- 【CSDN常见问题解答】使用JNA调用Windows动态库
- 【CSDN常见问题解答】Thread的run()和start()方法
- 机器学习、大数据、深度学习、数据挖掘、统计、决策和风险分析、概率和模糊逻辑的常见问题解答
- 【CSDN常见问题解答】让自己的电脑变成虚拟服务器(亲测成功)
- 【CSDN常见问题解答】使用JNA调用Windows动态库
- 【CSDN常见问题解答】目录文件编码转换
- 【CSDN常见问题解答】用HTTPClient自动登录Tomcat管理页面
- 帝国cms(ecms)在使用中的常见问题分析与解答
- Hadoop科普文——常见的45个问题解答(CSDN)
- 【CSDN常见问题解答】JSON和XML格式互相转换
- 阿里云常见问题分析与解答 推荐
- 【CSDN常见问题解答】Java Socket通信(TCP/UDP)
- 【CSDN常见问题解答】Web上传图片生成指定大小图片
- 【CSDN常见问题解答】Javap 的使用
- 【CSDN常见问题解答】Java多种数据库连接
- 机器学习、大数据、深度学习、数据挖掘、统计、决策和风险分析、概率和模糊逻辑的常见问题解答
- 【CSDN常见问题解答】Java中JSON转XML
- 【CSDN常见问题解答】Java如何读取XML文件