那点单实例的事

本来想弄个框出来的,弄了半天没有效果,不会整,就这样凑合着看吧

先在此声明:

  1. 它拥有一个私有构造函数,这确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量first与静态公有方法getFirst()。getFirst()方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。
  2. 一个静态的变量用来保存单实例的引用。
  3. 一个公有的静态方法用来获取单实例的引用,如果实例为null即创建一个。
  4. 有一个私有的无参构造函数,这可以防止其他类实例化它,而且单例类也不应该被继承,所以为了保险起见可以把该类定义成不允许派生,但没有要求一定要这样定义。(个人推荐)

第一种:  大家都会,没有什么好说的,不过在编程过程中,这种形式很多的话,挺费内存空间的。但是是线程安全的。

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;
 }
}

 


 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值