判断是否存在

/**

* 懒汉式

*/

public class LazySingleInstance {

// 私有构造方法

private LazySingleInstance(){};

// 私有的类对象

private static LazySingleInstance instance = null;

// 缺点:

// 1 每次都需要去判断instance 是否为空

// 2 调用时才去new对象,响应比较慢

// 3 多线程时,线程不安全,多线程同时获取该对象,线程不安全,可能会产生多个对象出来

public static LazySingleInstance getInstance() throws InterruptedException {

// 每次都需要判断instance是否为空,浪费资源

if (null == instance) {

Thread.sleep(1000);

instance = new LazySingleInstance();

}

return instance;

}

}

考虑线程

/**

* 懒汉式线程安全方法一

*/

public class ThreadSafeSingleInstance {

// 私有的静态实例

private static ThreadSafeSingleInstance instance;

// 私有的构造方法

private ThreadSafeSingleInstance(){};

/**

* 懒汉式线程安全方法

* 同步锁保护

* 缺点:

* 性能低下,且同时每次均需检查实例是否存在

* @return

* @throws InterruptedException

*/

public synchronized static ThreadSafeSingleInstance getInstance() throws InterruptedException {

if (instance == null) {

Thread.sleep(1000);

instance = new ThreadSafeSingleInstance();

}

return instance;

}

}

/**

* 懒汉式线程安全方法二

*/

public class ThreadSafeSingleInstance {

// 私有的静态实例

private static ThreadSafeSingleInstance instance;

// 私有的构造方法

private ThreadSafeSingleInstance(){};

/**

* 同步块保护加二次判断

* 解决问题

*/

public static ThreadSafeSingleInstance getInstance() throws InterruptedException {

if (instance == null) {

// 进方法后进行实例判断,若实例为空,进入同步块

// 多线程时,多个线程会同时进入到同步块外面等待

// 此时,一个线程拿到ThreadSafeSingleInstance.class 后,其他线程在synchronized块外面等待

// 待锁释放时,一个等待的线程拿到锁,同时再次检查实例是否为空

// 并决定是否要创建实例

synchronized (String.class) {//ThreadSafeSingleInstance.class) {

Thread.sleep(1000);

if (instance == null) {

instance = new ThreadSafeSingleInstance();

}

}

}

return instance;

}

}

每次都去new

/**

* 饿汉式

*/

public class HungrySingleInstance {

// 私有的构造方法

private HungrySingleInstance(){};

// 静态类变量,初始化类时变创建对象

private static HungrySingleInstance instance = new HungrySingleInstance();

// 或采用静态块形式初始化instance

static {

instance = new HungrySingleInstance();

}

/**

* 获取实例方法

* 优点:

* 线程安全,且不存在懒汉式的二次判断问题

* 缺点:

* 初始化即new 实例对象出来,违背资源利用习惯(即不管用不用都初始化实例出来)

* @return

*/

public static HungrySingleInstance getInstance() {

return instance;

}

}

测试类

public class SingleInstanceTest implements Runnable{

HungrySingleInstance hungrySingleInstance = null;

LazySingleInstance lazySingleInstance = null;

ThreadSafeSingleInstance threadSafeSingleInstance = null;

// @Override

// public void run() {

// hungrySingleInstance = HungrySingleInstance.getInstance();

// System.out.println("hungrySingleInstance.hashCode() " + hungrySingleInstance.hashCode());

//

// }

// @Override

// public void run() {

// try {

// lazySingleInstance = LazySingleInstance.getInstance();

// } catch (InterruptedException e) {

// e.printStackTrace();

// }

// System.out.println("lazySingleInstance.hashCode() " + lazySingleInstance.hashCode());

// }

@Override

public void run() {

try {

threadSafeSingleInstance = ThreadSafeSingleInstance.getInstance();

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("threadSafeSingleInstance() " + threadSafeSingleInstance.hashCode());

}

public static void main(String args[]) throws InterruptedException{

SingleInstanceTest singleInstanceTest = new SingleInstanceTest();

for (int i=0; i< 100; i++) {

Thread t = new Thread(singleInstanceTest, String.valueOf(i));

t.start();

}

}

}

java single instance_java单例模式(具体代码显现)两种方法相关推荐

  1. Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  2. [转]DES加密 java与.net可以相互加密解密两种方法

    [转]原文地址:http://jumpman.javaeye.com/blog/605996 DES加密 java与.net可以相互加密解密两种方法 文章分类:Java编程 通过这个方法可以实现jav ...

  3. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

  4. 阿里云上克隆代码的两种方法

    阿里云上克隆代码的两种方法 Https:在git Bash里直接输入git clone +https地址,便可以把代码克隆到本地了: SSH:要配置SSH Key: a. 首先检查c盘User-> ...

  5. HTML中写CSS代码的两种方法

    在HTML中写CSS代码也两种方法. 写在HTML标签里 使用CSS前 <h1>这是一个标题 </h1> 使用CSS后 <h1 style="color:red ...

  6. java 把图片插入窗体,JAVA JFrame窗体添加背景图像的两种方法

    首先还是要了解框架JFrame中的层次结构.JFrame中的层次分布及相对关系是:最底层是:JRootPane:第二层是:JlayerPane:最上层就是ContentPane,也正是我们常说的内容面 ...

  7. java hashmap 去重_java数组去重的两种方法

    我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...

  8. 使用MyBatis Generator自动生成持久层CRUD代码的两种方法

    最近在使用MyBatis,得知可以利用MyBatis Generator自动生成实体类.DAO接口和Mapping映射文件.当数据库中的表多的时候,让你不用再手写Mapping映射文件,和实体类,就可 ...

  9. java制作验证码(kaptcha)的两种方法

    第一种: 导入jar包com.github.axet生成法 ①导包 <dependency><groupId>com.github.axet</groupId>&l ...

最新文章

  1. 340. 通信线路(分层图最短路)
  2. Python 统计一行字符中单词的个数_Python 经典练习题-015
  3. ASP.NET .Net UCS2 加码最复杂的方法
  4. python生成器 图片分类_python批量处理图片图片Python迭代器和生成器介绍
  5. oracle Sql语句分类
  6. amazeui学习笔记二(进阶开发2)--Web组件简介Web Component
  7. equal java用法_equal,和等号的用法..
  8. 春季高考计算机专业专业分值,春季高考总分多少 分值分布情况如何
  9. Redis学习与实战之列表
  10. css面试题之Flex布局
  11. 飞机大战游戏源html代码,HTML5全民飞机大战游戏代码
  12. cdn贝免费套餐_CDN贝网站seo
  13. 修复图片移入移出抖动错位bug
  14. linux彻底清除历史记录
  15. 负载均衡(Load Balance)介绍
  16. 读 Samuel Enoch Stumpf 之《西方哲学史》
  17. 50个好网站,从此上网不再虚度!
  18. 第16届全国大学生智能汽车竞赛——百度智慧交通赛项技术方案公开
  19. python 安装spyder和问题
  20. php 查找 中文,PHP查找中文字符的解决方案

热门文章

  1. svn服务器搭建-SuSE Linux Enterprise Server 11 SP3
  2. 嵌入式linux的调试技术
  3. 在ubuntu下各种格式软件安装及常用命令
  4. .NET平台下Web树形结构程序设计
  5. Dcloud HTML5 监听蓝牙设备 调用 原生安卓实现 - aspirant - 博客园
  6. 实现div里的img图片水平垂直居中
  7. Python基础知识-05-数据类型总结字典
  8. 印尼发生洪灾和山体滑坡 致多人死亡数千人撤离
  9. IDEA将项目上传至码云/GitHub托管
  10. Web网页布局的主要方式 1