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设计模式之单例模式(七种方法)
单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...
随机推荐
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
- 在离线环境中使用.NET Core
在离线环境中使用.NET Core 0x00 写在开始 很早开始就对.NET Core比较关注,一改微软之前给人的印象,变得轻量.开源.跨平台.最近打算试着在工作中使用.但工作是在与互联网完全隔离的网 ...
- SQL Server-聚焦APPLY运算符(二十七)
前言 其实有些新的特性在SQL Server早就已经出现过,但是若非系统的去学习数据库你会发现在实际项目中别人的SQL其实是比较复杂的,其实利用新的SQL Server语法会更加方便和简洁,从本节开始 ...
- redis 学习笔记(2)
redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...
- 谈谈一些有趣的CSS题目(七)-- 消失的边界线问题
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- php批量删除
php批量删除可以实现多条或者全部数据一起删除 新建php文件 显示数据库中内容: <table width="100%" border="1" cell ...
- css3圆形百分比进度条的实现原理
原文地址:css3圆形百分比进度条的实现原理 今天早上起来在查看jquery插件机制的时候,一不小心点进了css3圆形百分比进度条的相关文章,于是一发不可收拾,开始折腾了... 关于圆形圈的实现,想必 ...
- ASP.NET MVC一次删除多笔记录
批量删除数据记录,如下面的截屏: 先选中想删除的记录,然后点一下删除铵钮,系统将把选中的记录一次性删除.在此,Insus.NET不想每删除一笔记录连接一次数据库. 因此需要把选择的记录一次上传至服务器 ...
- css样式之border-image
border-image-source 属性设置边框的图片的路径[none | <image>] div { border: 20px solid #000; border-image-s ...
- cesium自定义气泡窗口infoWindow
一.自定义气泡窗口与cesium默认窗口效果对比: 1.cesium点击弹出气泡窗口显示的位置固定在地图的右上角,默认效果: 2.对于习惯arcgis或者openlayer气泡窗口样式的giser来说 ...