java 设计模式之单例模式
-------Success is getting what you want, happiness is wanting what you get.
java设计模式之单例模式(Singleton):
---应用场合:只需要一个对象就可以了,例如一个朝代一个皇帝。
---作用:保证某个应用程序中某个实例有且只有一个。共同使用一个,节省资源。
---类型:饿汉模式,懒汉模式。
一.饿汉模式(类加载的时候就会实例化,线程安全)
- package com.sun.singleton;
- //饿汉模式
- public class Singleton {
- //将构造函数私有化,不允许外部直接调用创建对象
- private Singleton(){
- }
- //内部创建类的唯一实例,用private static 修饰(加载类时实例化一次,之后无论调用几次用的都是这一个实例)
- private static Singleton instance = new Singleton();
- //提供一个外部用于获取实例的方法,用 public static 修饰
- public static Singleton getInstance(){
- return instance;
- }
- }
二. 懒汉模式(比较懒,所以只有调用方法getInstance时候根据判断结果才会实例化,而且线程不安全)
线程不安全原因:如果是单线程那懒汉模式也没有问题,但如果是多线程且没有加锁处理就不行了。不如A,B两个线程,A线程首先调用getInstance方法,判断instance 为空,即将创建实例,就在这时cpu切换到B线程,A暂停。B线程调用getInstance方法判断instance为空,然后创建实例,创建结束后B线程结束,A线程开始继续执行,注意:此时A线程已经判断过instance为空,那么会继续创建实例,这样线程AB都各自创建了实例,就不再是单例模式。------所以懒汉模式要加锁同步。
- package com.sun.singleton;
- //懒汉模式(线程不安全)
- public class Singleton2 {
- //1.构造函数私有化,不允许外部直接调用
- private Singleton2(){
- }
- //2.只是声明类的唯一实例,这时没有真正实例化,使用private static 修饰
- private static Singleton2 instance;
- //3.提供获取实例的方法,用public static修饰
- // (1).解决线程不安全-------加同步(每个线程每次获取实例都要判断下锁,效率比较低)
- public static synchronized Singleton2 getInstance(){
- if(instance == null){
- return instance = new Singleton2();
- }
- return instance;
- }
- //(2).解决线程不安全-----双重检查锁定(提高效率)
- public static Singleton2 getInstance2(){
- /*如果第一个线程获取到了单例的实例对象,后面的线程再获取实例的时候不需要进入同步代码块中了*/
- if(instance == null){
- synchronized (Singleton2.class) {
- if(instance == null){
- instance = new Singleton2();
- }
- }
- }
- return instance;
- }
- }
输出:
- package com.sun.singleton;
- public class Main {
- public static void main(String[] args) {
- //实例化两次作比较测试
- //饿汉式
- Singleton s1= Singleton.getInstance();
- Singleton s2= Singleton.getInstance();
- if(s1==s2){
- System.out.println("饿汉式是同一个实例");
- }else{
- System.out.println("饿汉式不是同一个实例");
- }
- //懒汉式
- Singleton2 s3 = Singleton2.getInstance();
- Singleton2 s4 = Singleton2.getInstance();
- if(s3==s4){
- System.out.println("懒汉式是同一个实例");
- }else{
- System.out.println("懒汉式不是同一个实例");
- }
- }
- }
结果截图:
说明单例模式是同一个对象实例化是共享一个内存空间。
两者区别:
饿汉模式:类加载的时候比较慢(加载时候实例化),但是运行时候比较快,线程安全。
懒汉模式:类加载的时候比较快,但是运行时候比较慢(调用方法的时候实例化),线程不安全。
这是自己学习过程中的记录,方便自己回顾,好记性不如烂笔头。
作者:艺至
------------2015-11-20 16:42:51
java 设计模式之单例模式的更多相关文章
- 折腾Java设计模式之单例模式
博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...
- Java设计模式之单例模式(七种写法)
Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...
- Java 设计模式之单例模式(一)
原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...
- java设计模式1——单例模式
java设计模式1--单例模式 1.单例模式介绍 1.1.核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 1.2.常见场景 1.3.单例模式的优点 1.4.常见的五种单例模式实现 ...
- java设计模式之单例模式你真的会了吗?(懒汉式篇)
java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- java设计模式- (1)单例模式
参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...
- [转]JAVA设计模式之单例模式
原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...
- java设计模式之单例模式(七种方法)
单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...
随机推荐
- spring security源码分析之一springSecurityFilterChain
1. spring和spring security的集成,配置web.xml如下: <context-param> <param-name>contextConfigLocat ...
- 基于linux2.6.38.8内核zImage文件的自解压详解
转载:http://blog.csdn.net/wavemcu/article/details/7270439 ******************************************** ...
- socketpair理解
转载:http://liulixiaoyao.blog.51cto.com/1361095/533469/ 今天跟人谈到socketpair的问题,晚上回来写了个程序验证下自己的猜测! 先说说我的理解 ...
- K - Ancient Messages(dfs求联通块)
K - Ancient Messages Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Subm ...
- 测试 IE 浏览器兼容性 VirtualBox + modern.ie
VirtualBox 是开源的虚拟机软件,常用的虚拟机软件还有 VMware / Hyper-V / Paralles Desktop . modern.ie 是微软官方提供的用于测试网页在各版本 I ...
- 关于如何用sql语句查询出连续的一串数字
在数据库操作中,经常有一些这样的操作:插入诺干条测试数据.查询这个月的登录情况(没有登录的日期不能不存在,要显示数量为0),获取诺干条guid. 这些的基础都是怎么生成连续的一串数字 1 2 3 ...
- python 基础——私有属性
私有属性 python 私有属性以两个下划线开头. python 私有属性只能在类内部访问,类外面访问会出错. python 私有属性之所以不能在外面直接通过名称来访问,其实质是因为 python 做 ...
- 51nod 棋盘问题(博弈论)
题目链接: 棋盘问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 上帝创造了一个n*m棋盘,每一个格子都只有可能是黑色或者白色的. 亚当和夏娃在玩一个游戏,每次寻找边长为x的正方 ...
- CentOS安装VMware Tools
新建cdrom挂载目录 mkdir /mnt/cdrom 挂载光驱 mount -t auto /dev/cdrom /mnt/cdrom这命令就是把CentOS CDROM挂载在/mnt/cdrom ...
- freemarker编辑器eclipse插件
freemarker编辑器eclipse插件 支持语法高亮,语法校验,代码提示的工具 freemarker IDE(JBoss): http://download.jboss.org/jbossto ...