java 单例的实现及多线程下的安全
package com.demo01;
public class Single {
/**
* 设计模式:单例设计模式
* 解决一个类中只允许存在一个对象这种情况;
* 不允许通过类,无限制的创建该类的对象。
* 怎样实现单例模式?
* 构造函数私有化(private);
* 在当前类的内部,写一个方法创建出该类的对象;
* 对外提供公共的访问接口;
* */
public static void main(String[] args) {
}
}
/*
* 枚举enum实现单例模式
* 多线程下安全
*/
class ClassFactory{
private enum MyEnumSingleton{
singletonFactory;
private MSingleton instance;
private MyEnumSingleton(){//枚举类的构造方法在类加载是被实例化
instance = new MSingleton();
}
public MSingleton getInstance(){
return instance;
}
}
public static MSingleton getInstance(){
return MyEnumSingleton.singletonFactory.getInstance();
}
}
//需要获实现单例的类,比如数据库连接Connection
class MSingleton{
public MSingleton(){}
}
/*
* 内部类方式实现单例
* 多线程是安全
*/
class MySingleton {
//静态内部类
private static class MySingletonHandler{
private static MySingleton instance = new MySingleton();
}
private MySingleton(){}
public static MySingleton getInstance() {
return MySingletonHandler.instance;
}
}
/*
* 懒汉式:
* 在需要用的时候才创建对象
* 多线程下微调后,多线程下,无法保证实例唯一的,
*/
class Singer2{
private Singer2(){}
private static Singer2 createSinger = null;
//创建单例,
public static Singer2 getInstance(){
if(createSinger == null){
try {
Thread.sleep(200);
createSinger = new Singer2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return createSinger;
}
}
/*
* 懒汉式 方法加锁实现线程同步
* 加锁后效率低
*/
class Singer3{
private Singer3(){}
private static Singer3 createSinger = null;
//创建单例,synchronized加锁
public static synchronized Singer3 getInstance(){
if(createSinger == null){
try {
Thread.sleep(200);
createSinger = new Singer3();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return createSinger;
}
}
/*
* 懒汉式 同步代码块实现
* 效率低
*/
class Singer5{
private Singer5(){}
private static Singer5 createSinger = null;
//创建单例,synchronized加锁
public static Singer5 getInstance(){
try {
synchronized (Singer5.class) {
if(createSinger == null){
Thread.sleep(200);
createSinger = new Singer5();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return createSinger;
}
}
/*
* 懒汉式:
* 双检查锁机制DCL(double check lock)
* 销量和同步并存
*/
class Singer1{
private Singer1(){}
private static Singer1 createSinger = null;
//创建单例,synchronized加锁
public static Singer1 getInstance(){
try {
if(createSinger == null){
Thread.sleep(200);
synchronized (Singer1.class) {
if (createSinger==null) {
createSinger = new Singer1();
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return createSinger;
}
}
/*
* 俄汉式
* 开始就产生了对象。对于项目中从开始到结束都没有用到的对象,会造成资源浪费
* 多线程下测试安全,是同一个实例
*/
class Singer4{
private static Singer4 instance = new Singer4();
private Singer4(){}
public static Singer4 getInstance(){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
return instance;
}
}
多线程下的测试代码
package com.demo01;
public class MyThread extends Thread{
public void run() {
System.out.println(ClassFactory.getInstance().hashCode());
}
public static void main(String[] args) {
MyThread[] mts = new MyThread[10];
for(int i = 0 ; i < mts.length ; i++){
mts[i] = new MyThread();
}
for (int j = 0; j < mts.length; j++) {
mts[j].start();
}
}
}
java 单例的实现及多线程下的安全的更多相关文章
- 基于单例使用ThreadLocal对多线程下数据的访问修改
package cn.lyy.thread; import java.util.Random; /** * 基于单例模式的基础上,使用ThreadLocal为每一个进入的线程生成一个实例, * 用来对 ...
- java单例-积木系列
一步步知识点归纳吧,把以前似懂非懂,了解表面,知道点不知道面的知识归一下档. 懒汉式单例: 私有化构造函数,阻止外界实例话对象,调用getInstance静态方法,判断是否已经实例化. 为什么是懒 ...
- 【Java学习笔记之三十】详解Java单例(Singleton)模式
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- 转:java单例设计模式
本文转自:http://www.cnblogs.com/yinxiaoqiexuxing/p/5605338.html 单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton ...
- 熟悉的味道——从Java单例写到C++单例
设计模式中,单例模式是常见的一种.单例模式需要满足以下两个条件: 保证一个类只能创建一个示例: 提供对该实例的全局访问点. 关于单例最经典的问题就是DCL(Double-Checked Lock),今 ...
- Java单例设计模式的实现
1. 单例设计模式的定义 单例设计模式确保类只有一个实例对象,类本身负责创建自己的对象并向整个系统提供这个实例.在访问这个对象的时候,访问者可以直接获取到这个唯一对象而不必由访问者进行实例化. 单例设 ...
- Java单例类的简单实现
对于java新手来说,单例类给我的印象挺深,之前一道web后台笔试题就是写单例类.*.*可惜当时不了解. 在大部分时候,我们将类的构造器定义成public访问权限,允许任何类自由创建该类的对象.但在某 ...
- java单例的几种实现方法
java单例的几种实现方法: 方式1: public class Something { private Something() {} private static class LazyHolder ...
- java单例类/
java单例类 一个类只能创建一个实例,那么这个类就是一个单例类 可以重写toString方法 输出想要输出的内容 可以重写equcal来比较想要比较的内容是否相等 对于final修饰的成员变量 一 ...
随机推荐
- The server of Nginx(二)——Nginx基本功能配置
一.Nginx访问控制 (1)基于授权的访问控制 Nginx于Apache一样,可以实现基于用户授权的访问控制,当客户端要访问相应网站或者目录时要求输入用户名密码才能正常访问,配置步骤与Apache基 ...
- [web]Servlet中的Listener和Filter
建议先看看 ——> Servlet工作原理 一.Listener 在Tomcat服务中,Listener的设计是基于观察者模式的,目前在Servlet中提供6中两类事件的观察者接口,它们分别是: ...
- 2016级算法第三次上机-D.双十一的抉择
915 双十一的抉择 思路 中等题.简化题目:一共n个数,分成两组,使得两组的差最接近0,就是说要使两组数都尽可能的接近sum/2. 思路还是很混乱的,不知道如何下手,暴力也挺难的,还不能保证对.想一 ...
- App功能测试的注意点
好几个月没有写博客记录学习心得了,这次回老家深夜闲来无事写一篇记录下这段时间的面试心得,这次面试过程很多面试官都问APP的有关测试,下面我就自己的认识和工作中的经验来谈谈自己对APP测试的认识: 1. ...
- 【算法笔记】B1049 数列的片段和
1049 数列的片段和 (20 分) 给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, ...
- js计算日期相差天数
日期不能直接相加减比较大小,需要转换一下然后计算最后转换成天,当然,你也可以根据同样类似的方法去转换成小时,或者月,年. function DateDiff(sDate1, sDate2) { //s ...
- Python——单例设计模式
单例设计模式: 让类创建的对象,在系统中只有唯一的实例, 使用python类内置的__new__()方法实现,__new__()方法在创建对象时会被自动调用,通过重写__new__()方法,使得无论用 ...
- EXTJS文档地址
文档地址:http://docs.sencha.com/extjs/4.2.3/#!/api/Ext.form.field.Field-event-change
- python - 斐波那契(Fibonacci)数列
斐波那契数列即数列中每一项等于它前面两项的和,公式如下: f(n) = f(n-1) + f(n-2) n>2 ----- 递推公式 f(n) = 1 ...
- 【Nginx】关于域名转发proxy_pass
在配置nginx的时候,有一个需求,访问m.XXX.com的时候,需要实际访问www.YYY.com/m,并且域名不能发生变化. 达成这个需求有两种做法: 第一种就是301跳转,使用rewrite来跳 ...