java single instance_java单例模式(具体代码显现)两种方法
判断是否存在
/**
* 懒汉式
*/
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单例模式(具体代码显现)两种方法相关推荐
- Java构造和解析Json数据的两种方法详解一
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...
- [转]DES加密 java与.net可以相互加密解密两种方法
[转]原文地址:http://jumpman.javaeye.com/blog/605996 DES加密 java与.net可以相互加密解密两种方法 文章分类:Java编程 通过这个方法可以实现jav ...
- Java学习笔记:创建线程的两种方法
Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程
- 阿里云上克隆代码的两种方法
阿里云上克隆代码的两种方法 Https:在git Bash里直接输入git clone +https地址,便可以把代码克隆到本地了: SSH:要配置SSH Key: a. 首先检查c盘User-> ...
- HTML中写CSS代码的两种方法
在HTML中写CSS代码也两种方法. 写在HTML标签里 使用CSS前 <h1>这是一个标题 </h1> 使用CSS后 <h1 style="color:red ...
- java 把图片插入窗体,JAVA JFrame窗体添加背景图像的两种方法
首先还是要了解框架JFrame中的层次结构.JFrame中的层次分布及相对关系是:最底层是:JRootPane:第二层是:JlayerPane:最上层就是ContentPane,也正是我们常说的内容面 ...
- java hashmap 去重_java数组去重的两种方法
我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...
- 使用MyBatis Generator自动生成持久层CRUD代码的两种方法
最近在使用MyBatis,得知可以利用MyBatis Generator自动生成实体类.DAO接口和Mapping映射文件.当数据库中的表多的时候,让你不用再手写Mapping映射文件,和实体类,就可 ...
- java制作验证码(kaptcha)的两种方法
第一种: 导入jar包com.github.axet生成法 ①导包 <dependency><groupId>com.github.axet</groupId>&l ...
最新文章
- 340. 通信线路(分层图最短路)
- Python 统计一行字符中单词的个数_Python 经典练习题-015
- ASP.NET .Net UCS2 加码最复杂的方法
- python生成器 图片分类_python批量处理图片图片Python迭代器和生成器介绍
- oracle Sql语句分类
- amazeui学习笔记二(进阶开发2)--Web组件简介Web Component
- equal java用法_equal,和等号的用法..
- 春季高考计算机专业专业分值,春季高考总分多少 分值分布情况如何
- Redis学习与实战之列表
- css面试题之Flex布局
- 飞机大战游戏源html代码,HTML5全民飞机大战游戏代码
- cdn贝免费套餐_CDN贝网站seo
- 修复图片移入移出抖动错位bug
- linux彻底清除历史记录
- 负载均衡(Load Balance)介绍
- 读 Samuel Enoch Stumpf 之《西方哲学史》
- 50个好网站,从此上网不再虚度!
- 第16届全国大学生智能汽车竞赛——百度智慧交通赛项技术方案公开
- python 安装spyder和问题
- php 查找 中文,PHP查找中文字符的解决方案