1.饿汉式、不支持并发:

package com.ou;

//饿汉式
public class Singleton1 {
private Singleton1() {
}
private static Singleton1 instance = new Singleton1(); public static Singleton1 getInstance(){
return instance;
} }

此模式只能运行在单线程下,且类在加载时就已经创建好了实例,不管需不需要用。

2.懒汉式、不支持并发:

package com.ou;

//懒汉式、不支持多并发
public class Singleton2 {
private Singleton2() {
}
private static Singleton2 instance = null;
public static Singleton2 getInstance(){
if (instance == null){
instance = new Singleton2();
}
return instance;
} }

此模式只能运行在单线程下,在调用获取实例的方法时才创建实例。

3.懒汉式、支持并发、synchronized:

package com.ou;

//懒汉式、支持多并发、效率低
public class Singleton3 {
private Singleton3() {
}
private static Singleton3 instance = null;
public synchronized static Singleton3 getInstance(){
if (instance == null){
instance = new Singleton3();
}
return instance;
} }
synchronized 锁住了整个方法,当有多个线程需要访问方法时,不管实例有没有创建,都会要排队等待才能拿到实例,效率低。
需要改进:只有第一次创建实例时才需要锁,其他时候不需要加锁。

4.双重检查锁 、volatile(常用):

package com.ou;

//double checked locking、支持多并发、效率高、添加volatile关键字
public class Singleton4 {
private Singleton4() {
}
private volatile static Singleton4 instance = null;
public static Singleton4 getInstance(){
if (instance == null){//1
synchronized (Singleton4.class) {
if (instance == null)//2
instance = new Singleton4();
}
}
return instance;
}
}
volatile 关键字保证了内存可见性,所有线程都会去主存中取数据而不是在线程的缓存中取,保证了数据的更新能实时地对任何线程可见。
假如有两个线程同时到达了1,它们都去创建实例,这时候如果没有第二次判断,就会多次创建实例了。二次判断保证了多线程下只创建一个实例。

5.静态私有内部类(常用):

package com.ou;

//静态私有内部类、支持多并发、效率高、
public class Singleton5 {
private Singleton5() {
}
private static class SingletonHolder{
private static Singleton5 instance = new Singleton5();
}
public static Singleton5 getInstance(){
return SingletonHolder.instance;
}
}

内部类的好处:内部类在被调用的时候才实例化其静态成员变量,高!

Java单例模式的5种实现方式的更多相关文章

  1. JAVA中单例模式的几种实现方式

    1 线程不安全的实现方法 首先介绍java中最基本的单例模式实现方式,我们可以在一些初级的java书中看到.这种实现方法不是线程安全的,所以在项目实践中如果涉及到线程安全就不会使用这种方式.但是如果不 ...

  2. java单例模式的几种写法比较

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

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

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

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

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

  5. Java多线程的三种实现方式

    java多线程的三种实现方式 一.继承Thread类 二.实现Runnable接口 三.使用ExecutorService, Callable, Future 无论是通过继承Thread类还是实现Ru ...

  6. java多线程的几种实现方式

    java多线程的几种实现方式 1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target3.通 ...

  7. Python 单例模式的几种实现方式

    单例模式的几种实现方式 先来看几个魔法方法的简单运用:__new__, __init__, __call__. class A(object): def __init__(self, x): prin ...

  8. java 代理的三种实现方式

    Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public ...

  9. Python中的单例模式的几种实现方式的优缺点及优化

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

随机推荐

  1. centos/linux下的安装git

    1.下载git wget https://github.com/git/git/archive/v2.14.1.zip 2.安装依赖 sudo yum -y install zlib-devel op ...

  2. shell脚本比较字符串相等

    昨天在定位一个bug的时候,需要些shell脚本,用到了字符串的比较,出了一个小问题,就搜索总结了一下. 第一种方法:-eq 对比字符串是否相等,我首先想到的就是 -eq,然而打印的结果不正确.各种e ...

  3. Jar程序使用MyBatis集成阿里巴巴druid连接池

    在写jar程序,而不是web程序的时候,使用mybatis作为持久层,可以集成POOLED连接池,而阿里的druid不能用,确实很郁闷.不过有办法. 首先准备好数据库配置文件 然后对Druid进行一个 ...

  4. Spring Boot 2.0(三):Spring Boot 开源软件都有哪些?

    2016年 Spring Boot 还没有被广泛使用,在网上查找相关开源软件的时候没有发现几个,到了现在经过2年的发展,很多互联网公司已经将 Spring Boot 搬上了生产,而使用 Spring ...

  5. 【java学习笔记】正则表达式

    一.正则表达式 1.预定义字符集  . 表示任意一个字符 \d 表示任意一个数字 \w 表示任意一个单词字符(只能是数字.字母.下划线) \s 表示任意一个空白字符(\t\r\n\f\x0B) \D ...

  6. 前端日常常用git命令

    讲真,很早之前就想总结一下git常用的命令了,每次用着用着很多命令都记不住.而且我是英语渣包,有些单词慢慢靠背. git只是一个工具,我这写的只是适合我这种快速上手使用工具的小白,深究的请移步别处. ...

  7. 【Unity3D】Unity3D开发《我的世界》之六、创建地形(视频 + 源码)

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_06.html 一.引入LibNoise 虽然Unity3D里也有一个Mathf.P ...

  8. TI Davinci DM6446开发攻略——UBL移植

     UBL的程序设计,相对UBOOT.KERNEL.ROOTFS.设备驱动.DSP开发来说,还是比较简单.我们先从DAVINCI的启动说起,了解UBL在DAVIN系统中的位置和作用.对于固件程序烧写在N ...

  9. Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比

    比较的指标: 1.cpu 2.流量 3.电量 4.内存占用 5.联网时间 功能点: 1.重试机制 2.提供的扩展功能 3.易用性 4.是否https 5.是否支持reflect api,OkHttp有 ...

  10. bootrom脚本的创建

    bootrom脚本的创建     以下以压缩版bootrom 为例,基于Powerpc 平台,详细介绍压缩版bootrom 的生成过程及执行流程,从而使读者对bootrom有一个彻底的了解.这对于Vx ...