Java中单例七种写法(懒汉、恶汉、静态内部类、双重检验锁、枚举)
/***
* 懒汉模式 1
* 可以延迟加载,但线程不安全。
* @author admin
*
*/
public class TestSinleton1 {
private static TestSinleton1 sinleton;
private TestSinleton1(){ }
public static TestSinleton1 getSinleton(){
if(sinleton==null){
return new TestSinleton1();
}
return sinleton;
}
}
/***
* 懒汉模式变种 2
* @author admin
* 使用了synchronized关键字,既可以延迟加载,又线程安全,但是执行效率低。
*/
class TestSinleton2{
private static TestSinleton2 sinleton;
private TestSinleton2(){ }
public synchronized static TestSinleton2 getSinleton(){
if(sinleton==null){
return new TestSinleton2();
}
return sinleton;
}
}
/***
* 饿汉模式 3
* @author admin
* 基于classload机制,静态变量在类装载时进行初始化
* 可以避免线程安全问题,但是没有延迟加载。
*/
class TestSinleton3{
private static TestSinleton3 sinleton = new TestSinleton3();
private TestSinleton3(){
}
public static TestSinleton3 getSinleton(){
return sinleton;
}
}
/***
* 恶汉变种模式 4
* @author admin
* 基于静态 代码块,在实例化或者第一次调用时执行
* 既可以延迟加载,又线程安全
*/
class TestSinleton4{
private static TestSinleton4 sinleton =null;
static{
sinleton = new TestSinleton4();
}
public static TestSinleton4 getSinleton(){
return sinleton;
}
}
/***
* 双重校验锁 5
* @author admin
* 懒汉模式的优化版,拥有线程安全、高效率以及延迟加载等特性。但是这种方式需要jdk1.5以上,且在一些平台和编译器下有错。
*/
class TestSinleton5{
private static volatile TestSinleton5 sinleton;
private TestSinleton5(){ }
public static TestSinleton5 getSinleton(){
if(sinleton==null){
synchronized (TestSinleton5.class) {
if(sinleton==null){ sinleton = new TestSinleton5();
}
}
}
return sinleton;
}
}
/***
* 静态内部类 6
* @author admin
* 恶汉模式的优化版,在类被装载时,静态内部类并没有被实例化,
* 只有getInstance()时才 会装载 SingletonHolder 类,静态内部类方式也能很好地,实现线程安全、高效率和延迟加载特性。
*/
class TestSinleton6{
private static class SingletonHolder {
private static final TestSinleton6 sinleton = new TestSinleton6();
}
private TestSinleton6(){}
public static final TestSinleton6 getSinleton(){
return SingletonHolder.sinleton;
} }
/***
* 枚举7
* @author admin
*避免多线程同步问题
*/
enum TestSinleton7 {
SINLETON;
}
Java中单例七种写法(懒汉、恶汉、静态内部类、双重检验锁、枚举)的更多相关文章
- Java 单例模式的七种写法
Java 单例模式的七种写法 第一种(懒汉,线程不安全) public class Singleton { private static Singleton instance; private Sin ...
- Java:单例模式的七种写法(转载)
第一种(懒汉,线程不安全): package Singleton; /** * @echo 2013-10-10 懒汉 线程不安全 */ public class Singleton1 { priva ...
- Java:单例模式的七种写法[转]
第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 privat ...
- 【JAVA学习】单例模式的七种写法
尊重版权:http://cantellow.iteye.com/blog/838473 第一种(懒汉.线程不安全): Java代码 public class Singleton { private ...
- Java:单例模式的七种写法<转>
第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 privat ...
- 温故而知新(java实现)单例模式的七种写法
第一种(懒汉,线程不安全): Java代码 public class Singleton { private static Singleton instance; private Singleton ...
- Java设计模式之单例模式(七种写法)
Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...
- 单例模式:Java单例模式的几种写法及它们的优缺点
总结下Java单例模式的几种写法: 1. 饿汉式 public class Singleton { private static Singleton instance = new Singleton( ...
- java单例五种实现模式梳理
java单例五种实现模式 饿汉式(线程安全,调用效率高,但是不能延时加载) 一上来就把单例对象创建出来了,要用的时候直接返回即可,这种可以说是单例模式中最简单的一种实现方式.但是问题也比较明显.单例在 ...
随机推荐
- Neutron数据库同步错误 NotImplementedError: No support for ALTER of constraints in SQLite dialect
错误信息 root@controller:~# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron. ...
- javascript高级程序设计一(80-116)
81.函数内部属性:arguments.arguments.callee.this. window.color = "red"; var o={color:"blue&q ...
- 在EL表达式或者Struts标签库中格式化日期对象,即将Date转换为yyyy-MM-dd格式
一.EL表达式 首先,在jsp页面引入<fmt> tags,<%@ taglib prefix="fmt" uri="http://java.sun.c ...
- C++ 数据结构学习一(顺序表)
//SequentialList.h 顺序表模板类 #ifndef SEQUENTIAL_LIST_HXX#define SEQUENTIAL_LIST_HXX using std::cout; us ...
- gtest的Linux使用(Google test)
GTest是Google开发的跨平台而且开源的C++单元测试框架,很好很强大. 下载地址:https://code.google.com/p/googletest/ . 关于GTest在Windows ...
- jsp文件中的路径问题
最近在写一个OA系统,在资源的路径问题上面出现了一点问题,使用相对路径的话不利于文件的改动,所以使用了绝对路径来写. 在jsp文件中 <%= String path = request.ge ...
- Flink资料(7) -- 背压监控
背压(backpressure)监控 本文翻译自Back Pressure Monitoring --------------------------------------------------- ...
- windows中copy命令详解
功能:将一份文件或者多份文件复制到另一个位置 用法: copy [/D] [/V] [/N] [/Y|/-Y] [/Z] [/A | /B] source [/A | /B] [+ source [/ ...
- Ubuntu安装JDK(tar.gz)
如果没有创建root用户: sudo passwd root 在oracle官网下载jdk(百度"JDK")的tar.gz包: jdk-7u55-linux-x64.gz 这是我下 ...
- 02-4. BCD解密(10)
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位.所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12.但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了 ...