面试题二(不断优化的多种单例模式实现方式)
请你写出一个单例模式来。
好,这个题目很简单,相信大家都能很快的写出来(写出来立即编译没有错误—当时去IBM面试时候的要求)。
请大家放心,面试官是不会就这么放过你滴。
会分别问你:怎么才能更节省资源?多线程情况下怎么样?双重检查方式的单例模式?还有其它的实现方式么?
一步步进逼,不会让你大喘气滴。
大家来试试,只要写出下面四种方式的就可以了:
A:单线程下单例模式;
B:简单修改A中代码,实现多线程下的单例模式;
C:双重检查的单例模式;
D:还有其它实现方式么?
来吧,大家come on!!!
[解决办法]
- Java code
public class ReadWriteTextFile { private static ReadWriteTextFile rwt; public static ReadWriteTextFile getRWT(){ if(null==rwt){ rwt=new ReadWriteTextFile(); } return rwt; }}
[解决办法]
- Java code
public enum ReadWriteTextFile { Instance;}
[解决办法]
static {
....
}
这样就行了,何必非得需要时才new呢?我只关注结果。现在内存那么便宜。
[解决办法]
单例模式应该是只返回一次一个类的实例 static静态块如何返回一个类的实例呢 因为不能把所有代码方法都写在静态块里吧
[解决办法]
接分得
[解决办法]
- Java code
public class SingleTon { private static SingleTon singleTon = new SingleTon(); private SingleTon(){}; public static SingleTon getInstance() { return singleTon; }}
[解决办法]
- Java code
class SingleTon2 { private static SingleTon2 singleTon; static { singleTon = new SingleTon2(); } private SingleTon2(){}; public static SingleTon2 getInstance() { return singleTon; }}
[解决办法]
- Java code
class SingleTon3 { private static SingleTon3 singleTon3 = null; public synchronized SingleTon3 getInstance() { if (singleTon3 == null) { singleTon3 = new SingleTon3(); } return singleTon3; } }
[解决办法]
if (instance == null) {
synchronized (instance) {
if (instance == null) {
instance = new XXX();
}
}
}
return instance;
大概这么写 没写过 看人家差不多是这么写得
双重检查是啥。。。
[解决办法]
[解决办法]
[解决办法]
synchronized 我不懂什么双重检查
[解决办法]
[解决办法]
A:单线程下单例模式;
- Java code
public class Singleton { private static Singleton instance; private Singleton(){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }}
[解决办法]
[解决办法]
- Java code
public enum ReadWriteTextFile { Instance; public void annyMethod(){ }}
[解决办法]
Java 1.5实现Singleton可以用包含一个元素的枚举类型。在其他的单类模式中如果进行序列化和反序列化那就不仅仅是一个对象了,effective java建议用户用Java 1.5的枚举类型进行编写单类,可避免序列化和反序列化引起的问题。
- Java code
public enum Singleton { INSTANCE; public void leaceTheBuilding(){...}}
[解决办法]
[解决办法]
[解决办法]
关于这个问题。 在《JAVA与模式》一书中“单例模式” 那一章,你都可以找到答案
[解决办法]
[解决办法]
学习了
[解决办法]
......
算了,我是专门来看火龙果的
[解决办法]
《effective Java》作者推荐用enum来实现单例。
双检锁是有问题的
The "Double-Checked Locking is Broken" Declaration
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
[解决办法]
我也来过 观望+学习
[解决办法]
积累。。。学习中。。。。学习了。。。。thank you!Everybody~