Static 单例模式
Static 方法的问题
今天在看EhCache源码的时候,发现有一个这样的方法

这个是个典型的单例模式的工具类,但我所知道的单例模式的写法不是这样的,虽然《effect java》中推荐的方法是用枚举,static方法类似于枚举方法,但觉得这种单例模式确实值得学习学习。
看我的测试结果:
总共两个类
/**
* 测试单例类
* @author
wu
*
*/
public
class StaticClass {
public
static Integer id = 0;
private StaticClass(){
}
public
static
void sysInfo(){
System.out.println("this is " + id);
id++;
}
}
第二个类
package com.test;
/**
* 测试类
* @author
wu
*
*/
public
class TestMain {
public
static
void main(String[] args) {
test();
}
/**
次数,输出结果
*/
public
static
void test(){
for (int i = 0; i < 3; i++) {
StaticClass.sysInfo();
}
}
/**
* 多线程调用
*/
public
static
void runIt(){
for (int i = 0; i < 4; i++) {
new Thread(new Runnable() {
@Override
public
void run() {
StaticClass.sysInfo();
}
}).start();
}
}
}
第一次测试结果:
this is 0
this is 1
this is 2
这个结果证明每调用static方法,都不会产生新的实例,所以,符合单例模式的需求。是不是这样就可以直接说这个是单例模式了?
再看下面的多线程测试结果:
this is 0
this is 0
this is 0
this is 0
个不同的实例,所以上面的方法在多线程情况下是结果是不对的,不符合单例模式的需求。但有没有办法解决这种情况了?
答案是有的,多线程模式事以同步,加个关键字
public
synchronized
static
void sysInfo(){
System.out.println("this is " + id);
id++;
}
测试结果:
this is 0
this is 1
this is 2
this is 3
这样在多线程环境下也可以实现单例模式,这个方法确实比以前的单例模式好的地方,就是不需要在私有构造器中创建对象。也不需要担心多线程情况下出现其他错误情况!
Static 单例模式的更多相关文章
- Android 开发之static引发的冤案
前段时间在android手机系统上开发一个小东西,先介绍一下他吧: 就是当手指点击屏幕不论什么地方的时候会出现点击的特效,就是在你点击屏幕的地方会出现各种效果,比方:雪花纷飞;出现五彩的肥皂泡:鲜花盛 ...
- 艾编程coding老师课堂笔记:java设计模式与并发编程笔记
设计模式概念 1.1 什么是设计模式 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性. ...
- 类的static成员并用其实现一个单例模式
对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量.如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时我们可以用类的静态成员来 ...
- 基础学习day06---面向对象二---static,类的初始化和调用顺序、单例模式
一.static关键字 1.1.static关键字 静态:static用法:是一个修饰符,用于修饰成员(成员变量,成员函数)static 修饰的内容,所有对象共享当成员被静态修饰后,就多了一个调用方式 ...
- C# 的static与单例模式
C# 的static与单例模式 static是静态对象,在类被第一次使用,或者第一次被实例化时执行 /// <summary> /// 线程安全的单件模式 /// </summary ...
- java——多线程——单例模式的static方法和非static方法是否是线程安全的?
单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static ...
- JAVA Static方法与单例模式的理解
近期用sonar測评代码质量的时候,发现一个问题,project中一些util类,曾经写的static方法都提示最好用单例的方式进行改正. 为此,我细致想了想,发现还是非常有道理的.这里谈谈我个人对s ...
- C++ static与单例模式
单例模式是应用最多的一种设计模式,它要求系统中每个类有且只能有一个实例对象. 主要优点: 1.提供了对唯一实例的受控访问. 2.由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创 ...
- (1) 类构造块,this(),static,单例模式串讲
类构造块 在类只用一对大括号包含的内容,构造所有的对象时都会执行的内容,如果某个类有好几个够赞函数,公共部分抽取出来,放到构造块中. clas Boy { ... { syso("哭...& ...
随机推荐
- 【Unity 3D】学习笔记四十一:关节
关节 关节组件能够加入至多个游戏对象中,而加入关节的游戏对象将通过关节连接在一起而且感觉连带的物理效果.须要注意的是:关节必须依赖于刚体组件. 关节介绍 关节一共分为5大类:链条关节,固定关节,弹簧关 ...
- 把VBScript的函数迁移到C#.NET
原文:把VBScript的函数迁移到C#.NET VBScript 5.6 Functions C# code Abs System.Math.Abs Array New Object() { } A ...
- 调试经验--硬盘U菜
调试经验--硬盘U菜 随着嵌入式设备功能的开发,随着对存储设备的需求:需要存储大量数据信息.需要在转储数据,U盘升级功能等. 在使用存储设备的过程中,我们遇到一些问题,也总结了些经验: 1.几 ...
- Android分析应用程序的构建过程
为了方便Android应用开发要求我们Androidproject编制和包装有了更深入的了解,例如,我们知道这是做什么的每一步,境和工具.输入和输出是什么.等等. 在前文<命令行下Android ...
- 在地图中使用Java
Map以按键/数值对的形式存储数据,和数组很类似,在数组中存在的索引,它们本身也是对象. Map的接口 Map---实现Map Map.Entry--Map的内部类 ...
- VBS学习日记(一个) 开始了解
Vbs 一个 Windows 脚本,其代表 :Microsoft Visual Basic Script Editon.( 微软可视化BASIC 脚本版),VBS 是 Visual Basic 的的一 ...
- Lightdm:奔跑吧GUI[已解决]
Fedora替换gdm为lightdm解决无法登陆问题 前两天安装Codeblocks,这货安装了很多包和依赖,直接导致我重启进步去界面,卡在fedora LOGO处,如下 实在忧伤,已经因为折腾不知 ...
- Asterisk 未来之路3.0_0002
原文:Asterisk 未来之路3.0_0002 伟大的变化需要可扩展性技术 每一个现有的PBX都因为其自身的缺点变的糟糕,不管其功能如何丰富,总有一些东西会漏掉.具备非常完全功能的PBX 也不能预见 ...
- HDU 2064 汉诺塔III
汉诺塔III Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 【转】删除修改Eclipse里的SVN账户
转自http://msongli.iteye.com/blog/1186648 引自: http://wanghongxu.iteye.com/blog/539806 http://jxdwuao.i ...