什么是单例?:其定义是单例对象的类只能允许一个实例存在

单例的实现基本原理:1.将该类的构造方法定义为私有访问,不对外暴露从而使其他类不能实例化该类对象,只能通过该类的静态方法得到该类的唯一实例 2.在该类中定义一个静态方法(getInstance),当我们调用该方法时返回该类的实例对象

几种实现方式:

饿汉式单例模式:

/**

  • 饿汉式静态常量式单例模式
  • 优点:这种写法在JVM装载类的时候就实例化了,避免了线程同步的问题
  • 缺点:在类装载的时候就实例化,没有达到延时加载的效果,造成内存浪费
  • @author zhuys

    */

    public class HungrySinglton {

    //使用经常常量初始化实例

    private final static HungrySinglton hungrySinglton = new HungrySinglton();

// 使用静态块初始化类的实例,与上面效果一致

// private static HungrySinglton hungrySinglton;

// static {

// hungrySinglton = new HungrySinglton();

// }

private HungrySinglton() {};

public static HungrySinglton getInstance() {
return hungrySinglton;
}

}

懒汉式单例模式(非同步):

/**

  • 懒汉式单例模式:非同步
  • 优点:在调用的时候初始化该单例
  • 缺点:并非线程同步,不建议使用
  • @author zhuys

*/

public class LazySingleton {

private static LazySingleton lazySingleton;

private LazySingleton() {};

public static LazySingleton getInstance() {
if(lazySingleton == null) {
lazySingleton = new LazySingleton();
}
return lazySingleton;
}

}

懒汉式单例(同步):

/**

  • 懒汉式单例模式:同步
  • 优点:在调用的时候初始化该单例并实现线程同步
  • @author zhuys

*/

public class LazySyncSingleton {

private static LazySyncSingleton lazySingleton;

private LazySyncSingleton() {};

//法1:该方式使用synchronized同步锁将整个方法同步 实现线程同步 但同步整个方法在高并发的情况下会造成阻塞
//效率低下,不推荐使用
public static synchronized LazySyncSingleton getInstance1() {
if(lazySingleton == null) {
lazySingleton = new LazySyncSingleton();
}
return lazySingleton;
} //法2:使用synchronized同步实例化改单例的代码块;但该方法不能完全实现同步,可能会产生多个实例;例如:在第一次创建时
//多个线程同时进入if(lazySingleton == null) 则会产生多个实例 不推荐使用
public static LazySyncSingleton getInstance2() {
if(lazySingleton == null) {
synchronized (LazySyncSingleton.class) {
lazySingleton = new LazySyncSingleton();
}
}
return lazySingleton;
}
//法3:双重检查法,同步代码块中再次检查一次是否w为null解决了上述问题 推荐使用
public static LazySyncSingleton getInstance3() { if(lazySingleton == null) {
synchronized (LazySyncSingleton.class) {
if(lazySingleton == null) {
lazySingleton = new LazySyncSingleton();
}
}
}
return lazySingleton;
}

}

内部类单例模式:

package pers.ly.learn.designModel.singleton;

/**

  • 静态内部类单例模式:
  • 静态内部类方式在InnerSingleton类被装载时并不会立即实例化
  • 因为静态内部类是在调用的时候才会实例化,这样就达到了延时加载节省资源的效果
  • 另外在静态内部类中通过静态常量初始化该单例又到达了保证其唯一性的效果
  • 优点:避免了线程不安全,延迟加载,效率高。 推荐使用
  • @author zhuys

*/

public class InnerSingleton {

private InnerSingleton() {};

private static class InnerSingletonInstance{
private final static InnerSingleton innerSingleton = new InnerSingleton();
} public static InnerSingleton getInstance() {
return InnerSingletonInstance.innerSingleton;
}

}

JAVA单例模式的实现伪代码的更多相关文章

  1. 用java单例模式实现面板切换

    1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public class Singleton_ { //设为私有方法,防止被外部类引用或实例 priv ...

  2. 【深入】java 单例模式(转)

    [深入]java 单例模式 关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便 ...

  3. 深入Java单例模式(转)

    深入Java单例模式 源自 http://devbean.blog.51cto.com/448512/203501 在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容 ...

  4. Java 单例模式的七种写法

    Java 单例模式的七种写法 第一种(懒汉,线程不安全) public class Singleton { private static Singleton instance; private Sin ...

  5. java单例模式之懒汉式分析

    转自:http://blog.csdn.net/withiter/article/details/8140338 今天中午闲着没事,就随便写点关于Java单例模式的.其实单例模式实现有很多方法,这里我 ...

  6. Java 单例模式探讨

    以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...

  7. 单例模式:Java单例模式的几种写法及它们的优缺点

    总结下Java单例模式的几种写法: 1. 饿汉式 public class Singleton { private static Singleton instance = new Singleton( ...

  8. 9种Java单例模式详解(推荐)

    单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象.  懒汉式(线程不安全) 其主要表现在单例类在外 ...

  9. 你真的理解了java单例模式吗?讲别人都忽略的细节!

    前言:老刘这篇文章敢做保证,java的单例模式讲的比大多数的技术博客都要好,讲述别人技术博客都没有的细节!!! 1 java单例模式 直接讲实现单例模式的两种方法:懒汉式和饿汉式,单例模式的概念自己上 ...

随机推荐

  1. centos7 下网卡的配置

    一般通过修改配置文件的方式去修改: 网卡配置文件位置    /etc/sysconfig/network-scripts/ifcfg-ens33 DNS配置文件位置              /etc ...

  2. 使用ActiveMQ实现JMS消息通信服务

    PTP(点对点的消息模型) 在点对点模型中,相当于两个人打电话,两个人独享一条通信线路.一方发送消息,一方接收消息. 在p2p的模型中,双方通过队列交流,一个队列只有一个生产者和一个消费者. 1.建立 ...

  3. css3的calc属性不生效问题

    css3的 calc:计算属性.由于自己做的项目中这个属性不常用到,偶尔用一次还没效果. 后来研究了下是因为运算符两边没加空格. 错误示例:.content{width:calc(100%-50px) ...

  4. 解决Response.AddHeader中文乱码问题

    string filename = HttpUtility.UrlEncode(Encoding.UTF8.GetBytes("培训班自然情况表")); Response.AddH ...

  5. Jquery复习(六)之remove()易忘点和trigger()

    过滤被删除的元素 jQuery remove() 方法也可接受一个参数,允许您对被删元素进行过滤. 该参数可以是任何 jQuery 选择器的语法. 下面的例子删除 class="italic ...

  6. 利用ARouter实现组件间通信,解决子模块调用主模块问题

    如果你还没使用过ARouter请你按照这篇下面博客尝试使用下然后再往下看组件通信的内容(不然的话可能会懵逼)Android Studio接入ARouter以及简单使用 如果你使用过ARouter请继续 ...

  7. mac StarUML3.0.2破解

    mac StarUML3.0.2破解 StarUML是一款开放源码的UML开发工具,是由韩国公司主导开发出来的产品,可以直接到StarUML网站下载.可以用来创建UML类图. 破解办法是通过asar工 ...

  8. JVM运行时的内存划分--JDK1.8

    对比JDK1.7,JDK1.8在运行时的内存分配上进行了调整.本篇对JDK1.8版本进行简要介绍. 先以一张图片描述运行时内存: 程序计数器 记录当前线程执行的字节码行号.如果执行的是native方法 ...

  9. pandas库

    pandas是基于NumPy数组构建的,特别是基于数组的函数和不使用for循环的数据处理.虽然pandas采用了大量的NumPy编码风格,但二者最大的不同是pandas是专门为处理表格和混杂数据设计的 ...

  10. mariadb读写分离

    mycat maraidb主从架构,是主负责写,从负责读,但前端如果没有调度器的话,是无法实现读写分离的.这就涉及到了中间站,它就是mycat.一定要在主从架构的基础之上实现读写分离. 配置三台的主从 ...