本来想弄个框出来的,弄了半天没有效果,不会整,就这样凑合着看吧
先在此声明:
- 它拥有一个私有构造函数,这确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量first与静态公有方法getFirst()。getFirst()方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。
- 一个静态的变量用来保存单实例的引用。
- 一个公有的静态方法用来获取单实例的引用,如果实例为null即创建一个。
- 有一个私有的无参构造函数,这可以防止其他类实例化它,而且单例类也不应该被继承,所以为了保险起见可以把该类定义成不允许派生,但没有要求一定要这样定义。(个人推荐)
第一种: 大家都会,没有什么好说的,不过在编程过程中,这种形式很多的话,挺费内存空间的。但是是线程安全的。
final class Single1 {
private static final First first = new First();
private Single1() {
}
public static First getFirst() {
return first;
}
}
第二种:这种方式在单线程程序中,没有什么问题,但是在多线程并发访问的时候,就不安全了,就不是单个实例了,不严谨。
final class Single2 {
private static First first = new First();
private Single2() {
}
public static First getFirst() {
return first!=null?first:(first=new First());
}
}
第三种:这种方式通过 借用一个多余的对象,通过锁住objec对象,来限制单例first的获取。但多并发的时候,会造成线程阻塞,强制的把多并发的线程变成串行执行的形式(变相的单线程,当然安全了),使cpu资源得不到充分的利用,降低性能。
final class Single3 {
private static First first = null;
private static Object object =new Object();
private Single3() {
}
public static First getFirst() {
synchronized (object) {
return first!=null?first:(first=new First());
}
}
}
第四种:
前面讲到的线程安全的实现方式的问题是要进行同步操作,那么我们是否可以降低通过操作的次数呢?其实我们只需在同步操作之前,添加判断该实例是否为null就可以降低通过操作的次数了,这种方式相对于其他方式较好些,采用双重检查锁定的方式,一定程度上节省了时间,提高了响应效率。
final class Single4 {
private static First first = null;
private Single4() {
}
public static First getFirst() {
if (first == null) {
synchronized (First.class) {
if (first == null) {
first = new First();
}
}
}
return first;
}
}
5405

被折叠的 条评论
为什么被折叠?



