单例模式的写法和线程安全性的讨论

//饿汉模式:单例模式,就是无论用不用,什么时候用,在类加载的时候就实例化一个这个类的对象

//然后等到使用的时候,就是使用同一个实例对象

//好处:在多线程的环境下使用这种方法,可以避免多线程带来的冲突。与之相对应的是,懒汉模式(按需实例化)

class Singleton1{
	private Singleton1(){}
	private static Singleton1 s1 = new Singleton1();
	public static Singleton1 getSingleton(){
		return s1;
	}
}

//懒汉模式:单例模式,

//好处:直到使用才进行实例对象的初始化,避免内存的浪费

//坏处:会遇到线程安全性问题

class Singleton2{
	private Singleton2(){}
	private static Singleton2 s2 = null;
	public static Singleton2 getSingleton2(){
		if(s2 == null){
			s2 = new Singleton2();
		}
		return s2;
	}
}

//登记式模式:借助内部类,属于懒汉式单例,因为Java机制规定,

//内部类SingletonHolder只有在getInstance()方法第一次调用的时候才会被加载(实现了lazy),

//而且其加载过程是线程安全的,所以这种模式克服了懒汉和饿汉模式的缺点

class Singleton3{
	private Singleton3(){}
	private static class SingleHolder{
		private final static Singleton3 s3 = new Singleton3();
	}

	public static Singleton3 getSingleton3(){
		return SingleHolder.s3;
	}
}

//普通加锁解决单例模式的线程安全问题

//分析:虽然解决了线程安全问题,但是每个线程调用getInstance都要加锁,

//我们想要只在第一次调用getInstance时加锁,就需要进行改进

class Singleton4{
	private static Singleton4 s4= null;
	private Singleton4(){}
	public static synchronized Singleton4 getSingleton4(){
		if(s4 == null){
			s4 = new Singleton4();
		}
		return s4;
	}
}

时间: 2024-10-11 20:06:47

单例模式的写法和线程安全性的讨论的相关文章

单例模式:Qt本身就提供了专门的宏 Q_GLOBAL_STATIC 通过这个宏不但定义简单,还可以获得线程安全性

标题起的是有点大 主要是工作和学习中,遇到些朋友,怎么说呢,代码不够Qt化 可能是由于他们一开始接触的是 Java MFC 吧 接触 Qt 7个年头了 希望我的系列文章能抛砖引玉吧 单例模式 很多人洋洋洒洒写了一大堆 比如这里 http://xtuer.github.io/qtbook-singleton/ 比如这里 http://m.blog.csdn.net/Fei_Liu/article/details/69218935 但是Qt本身就提供了专门的宏 Q_GLOBAL_STATIC 通过这

一天一个设计模式——(Singleton)单例模式(线程安全性)

一.模式说明 有时候,我们希望在应用程序中,仅生成某个类的一个实例,这时候需要用到单例模式. 二.模式类图 三.模式中的角色 Singleton角色,该模式中仅有的一个角色,该角色有一个返回唯一实例的getInstance方法,该方法总是返回同一个实例: 四.代码示例 单例模式比较简单,要实现单例模式只需保证三点: 私有化类的构造函数: 在类中创建类的对象: 提供获取对象的公有方法: package com.designpattern.cn.singletonpattern; public cl

设计模式:单例模式的写法(基础写法和线程安全写法)

单例模式的写法非常多.先给出一种最基础的写法: (A种写法): package singleton; public class SingletonInstance { private static SingletonInstance mSingletonInstance = null; // 特意将构造函数设置成 private,防止外部使用者new SingletonInstance(). private SingletonInstance() { } public static Single

2017.12.11SimpleDateFormat的线程安全性讨论

转载来自:http://blog.csdn.net/zxh87/article/details/19414885 1.结论 DateFormat和SimpleDateFormat都不是线程安全的.在多线程环境中调用format()和parse()应处理线程安全的问题. 2.错误示例 (1)错误示例1 每次处理一个时间信息,都新建一个SimpleDateFormat实例,然后再丢弃.造成内存的浪费. 1 package com.peidasoft.dateformat; 2 3 import ja

线程安全性

多线程程序中,如果控制不好,经常会出现各种的问题,有时候问题在调试或者测试的时候就会暴露出来,最要命的是程序部署一段时间之后才出现各种怪异现象,感到头疼?需要补充Java并发的知识了.该读书笔记系列以<Java并发编程实战>为基础,同时会参考网络上一些其他的资料,和大家一起学习Java并发编程的各个方面.这方面也是笔者比较薄弱的地方,理解不对的地方请留言或者邮件指出,同时也欢迎讨论.邮箱:[email protected] 线程安全性这章,将从如下几个方面入手,描述探讨: 1.什么是对象的状态

深度分析Java的枚举类型—-枚举的线程安全性及序列化问题

原文:深度分析Java的枚举类型--枚举的线程安全性及序列化问题 枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和class一样,只是一个关键字,他并不是一个类,那么枚举是由什么类维护的呢,我们简单的写一个枚举: public enum t { SPRING,SUMMER,AUTUMN,WINTER; } 然后我们使用反编译,看看这段代码到底是怎么实现的,反编译(Java的反编译)后代码内容如下: public fin

ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 以及 同步的集合类 Hashtable 和 Vector Collections.synchronizedMap 和 Collections.synchronizedList 区别缺点

ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含了一些主要集合类型 List 和 Map 的高性能的.线程安全的实现.在本月的 Java理论与实践中,BrianGoetz向您展示了用 ConcurrentHashMap 替换 Hashtable 或 synchronizedMap ,将有多少并发程序获益. 在Java类库中出现的第一个关联的集合类

浅析HashMap与ConcurrentHashMap的线程安全性

本文要解决的问题: 最近无意中发现有很多对Map尤其是HashMap的线程安全性的话题讨论,在我的理解中,对HashMap的理解中也就知道它是线程不安全的,以及HashMap的底层算法采用了链地址法来解决哈希冲突的知识,但是对其线程安全性的认知有限,故写这篇博客的目的就是让和我一样对这块内容不熟悉的小伙伴有一个对HashMap更深的认知. 哈希表 在数据结构中有一种称为哈希表的数据结构,它实际上是数组的推广.如果有一个数组,要最有效的查找某个元素的位置,如果存储空间足够大,那么可以对每个元素和内

Spring中如何获取request的方法汇总及其线程安全性分析

前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性.下面话不多说了,来一起看看详细的介绍吧. 概述 在使用Spring MVC开发Web系统时,经常需要在处理请求时使用request对象,比如获取客户端ip地址.请求的url.header中的属性(如cookie.授权信息).body中的数据等.由于在Spring MVC中,处理请求的Controller.Service等对象都是单例的,因此获取request对象时最需要注意的问题,便是