java设计模式之--单例模式
前言:最近看完《java多线程编程核心技术》一书后,对第六章的单例模式和多线程这章颇有兴趣,我知道我看完书还是记不住多少的,写篇博客记录自己所学的只是还是很有必要的,学习贵在坚持。
单例模式,也就是一个类只有一个实例,任何对象要访问这个类只能通过这个实例对象来访问,我们把房子比喻一个java类,每个房子只有一把钥匙(好比每个类只有一个实例),这样唯有房子的主人才有这个钥匙才能访问房子,其他人访问不了。
我们来看一下怎么写一个单例模式的java代码,方法有很多种:
1.立即加载(也叫饿汉模式)
我们来看下具体的代码
package singleton;
public class Myclass {
//类加载初始化的时候就会生成一个实例
private static Myclass myclass=new Myclass();
//把构造函数使用private修饰符修饰
private Myclass() {
}
public static Myclass getInstance() {
return myclass;
}
}
既然构造函数是私有的,那我们怎么调用这个类的对象呢?我们可以通过类名+方法的方式来获取这个对象,代码如下:
package singleton;
public class Test1 {
public static void main(String[] args) {
//不能通过new来生成一个Myclass对象,编译报错
//Myclass myclass=new Mycalss();
Myclass myclass1=Myclass.getInstance();
Myclass myclass2=Myclass.getInstance();
//我们来打印一下上面两个对象的hashcode
System.out.println(myclass1.hashCode());
System.out.println(myclass2.hashCode());
}
}

2.延迟加载(也叫懒汉模式)
下面我们来看看懒汉模式,也就是调用get方法的时候才实例化一个对象出来
package singleton;
public class Myclass_1 {
private static Myclass_1 myclass_1;
private Myclass_1() {
}
public static Myclass_1 getInstance() {
if (myclass_1!=null) {
} else {
myclass_1=new Myclass_1();
}
return myclass_1;
}
}
测试代码
package singleton;
public class Test1 {
public static void main(String[] args) {
//不能通过new来生成一个Myclass对象,编译报错
//Myclass myclass=new Mycalss();
/*Myclass myclass1=Myclass.getInstance();
Myclass myclass2=Myclass.getInstance();*/
Myclass_1 myclass1=Myclass_1.getInstance();
Myclass_1 myclass2=Myclass_1.getInstance();
//我们来打印一下上面两个对象的hashcode
System.out.println(myclass1.hashCode());
System.out.println(myclass2.hashCode());
}
}
运行结果和上面的图是一样的
其实这里有一个很大的问题。那就是懒汉模式在多线程模式下是完全错误的
我们来看看在多线程下是什么样子的
线程类代码如下:
package singleton;
public class Mythread extends Thread{
public void run() {
System.out.println(Myclass_1.getInstance().hashCode());
}
}
测试代码:
package singleton;
public class RunTest {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
new Mythread().start();
}
}
}
运行结果
可以看出在多线程下生成了两个不同的实例对象。而我们想要的是单例啊
下面的做法是直接在用synchronized关键字修饰getInstance,但是这个这样会锁住整个方法,效率低下
package singleton;
public class Myclass_1 {
private static Myclass_1 myclass_1;
private Myclass_1() {
}
public static synchronized Myclass_1 getInstance() {
if (myclass_1!=null) {
} else {
myclass_1=new Myclass_1();
}
return myclass_1;
}
}
下面的方法是使用同步语句块来做,效率也同样低下,和上面的做法半斤八两
package singleton;
public class Myclass_1 {
private static Myclass_1 myclass_1;
private Myclass_1() {
}
public static Myclass_1 getInstance() {
synchronized (Myclass_1.class) {
if (myclass_1!=null) {
} else {
myclass_1=new Myclass_1();
}
}
return myclass_1;
}
}
我们来看看最高效的方法吧(何为高效?就是尽量把锁住的代码块缩小范围而又不发生错误),使用DCK双检查锁机制来解决
代码如下:
package singleton;
public class Myclass_1 {
private static Myclass_1 myclass_1;
private Myclass_1() {
}
public static Myclass_1 getInstance() {
if (myclass_1!=null) {
} else {
synchronized (Myclass_1.class) {
//再次判断
if (myclass_1==null) {
myclass_1=new Myclass_1();
}
}
}
return myclass_1;
}
}
欢迎访问我的个人网站
java设计模式之--单例模式的更多相关文章
- java 设计模式之单例模式
-------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...
- 折腾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设计模式之单例模式(七种方法)
单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...
随机推荐
- IE6/7下空div占用空间的问题
最近注意力没在前端上面,工作碰到这样一个问题,下意识的写了句 font-size:0;line-height:0;哪知道引发了更大的bug.后来插入数据进去的时候都不显示了..再后来百度一番找到,原来 ...
- ABP文档 - 导航
文档目录 本节内容: 创建菜单 注册导航供应器 显示菜单 每个web应用都有一些菜单用来在页面/屏幕之间导航,ABP提供了一个通用的基础框架创建并显示菜单给用户. 创建菜单 一个应用可能由不同模块组成 ...
- xpath提取多个标签下的text
title: xpath提取多个标签下的text author: 青南 date: 2015-01-17 16:01:07 categories: [Python] tags: [xpath,Pyth ...
- lua执行字节码的过程介绍
前面一篇文章中介绍了lua给下面代码生成最终的字节码的整个过程,这次我们来看看lua vm执行这些字节码的过程. foo = "bar" local a, b = "a& ...
- WebAPi之SelfHost自创建证书启动Https疑难解惑及无法正确返回结果
前言 话说又来需求了,之前对于在SelfHost中需要嵌套页面并操作为非正常需求,这回来正常需求了,客户端现在加了https,老大过来说WebAPi访问不了了,这是什么情况,我去试了试,还真是这个情况 ...
- [systemtap手记]debian体系安装过程
Debian体系,本人测试用机 Ubuntu 11.10 uname -r 查看原本的内核版本为 3.0.0-12-generic 第一步: 安装systemtap包 $ sudo apt-get i ...
- Spring cache简单使用guava cache
Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...
- OpenLiveWriter代码插件
1.OpenLiveWriter安装 Windows Live Writer在2012年就停止了更新,Open Live Writer(以下简称OLW)是由Windows Live WriterWri ...
- JDK动态代理
一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...
- PHP static静态属性和静态方法
这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...