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 单例的实现及多线程下的安全的更多相关文章

  1. 基于单例使用ThreadLocal对多线程下数据的访问修改

    package cn.lyy.thread; import java.util.Random; /** * 基于单例模式的基础上,使用ThreadLocal为每一个进入的线程生成一个实例, * 用来对 ...

  2. java单例-积木系列

    一步步知识点归纳吧,把以前似懂非懂,了解表面,知道点不知道面的知识归一下档.   懒汉式单例: 私有化构造函数,阻止外界实例话对象,调用getInstance静态方法,判断是否已经实例化. 为什么是懒 ...

  3. 【Java学习笔记之三十】详解Java单例(Singleton)模式

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  4. 转:java单例设计模式

    本文转自:http://www.cnblogs.com/yinxiaoqiexuxing/p/5605338.html 单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton ...

  5. 熟悉的味道——从Java单例写到C++单例

    设计模式中,单例模式是常见的一种.单例模式需要满足以下两个条件: 保证一个类只能创建一个示例: 提供对该实例的全局访问点. 关于单例最经典的问题就是DCL(Double-Checked Lock),今 ...

  6. Java单例设计模式的实现

    1. 单例设计模式的定义 单例设计模式确保类只有一个实例对象,类本身负责创建自己的对象并向整个系统提供这个实例.在访问这个对象的时候,访问者可以直接获取到这个唯一对象而不必由访问者进行实例化. 单例设 ...

  7. Java单例类的简单实现

    对于java新手来说,单例类给我的印象挺深,之前一道web后台笔试题就是写单例类.*.*可惜当时不了解. 在大部分时候,我们将类的构造器定义成public访问权限,允许任何类自由创建该类的对象.但在某 ...

  8. java单例的几种实现方法

    java单例的几种实现方法: 方式1: public class Something { private Something() {} private static class LazyHolder ...

  9. java单例类/

    java单例类  一个类只能创建一个实例,那么这个类就是一个单例类 可以重写toString方法 输出想要输出的内容 可以重写equcal来比较想要比较的内容是否相等 对于final修饰的成员变量 一 ...

随机推荐

  1. 浅谈iOS开发中多语言的字符串排序

    一.前言 在iOS开发中,一个经常的场景是利用tableview展示一组数据,以很多首歌曲为例子.为了便于查找,一般会把这些歌曲按照一定的顺序排列,还会加上索引条以便于快速定位. 由于歌曲名可能有数字 ...

  2. 如何调用另一个包中的Application

    在项目中要集成Xabber,将它作为一个Lib, ..... Xabber 原有代码 /** * Base entry point. * * @author alexander.ivanov */ p ...

  3. ubuntu 使用ifupdown 进行高级网络设置

    ifupdown ubuntu 本身支持linux的网络底层设置命令:ifconfig,route,ip 等命令,但为了让网络设置更加简单,Debian 提供了一个标准的高级网络设置工具,包含 ifu ...

  4. 北航软院2012级C#期末考试部分考题解答

    博主注:本渣渣水平有限,文中若有不对的地方敬请指出,谢谢. 本文中大部分图片来自老师的PPT,感谢邵老师,想要的可以点击右边QQ联系我:) 一.选择题(2*15=30) 1.In C# what is ...

  5. nginx克隆之后问题

    [alert] kill(2942, 1) failed (No such process) 背景:虚拟机克隆之后启动service nginx reload报这个错,而且没有日志 根据这个博文htt ...

  6. HTML5 Canvas核心技术 图形、动画与游戏开发学习总结

    save 和 restore 函数的应用 保存canvas和恢复canvas clip函数的应用 文字的绘制 背景图片的绘制 离屏canvas 基于时间的运动

  7. spider_keeper

    一 简介 spider_keeper 是一款开源的spider管理工具,可以方便的进行爬虫的启动,暂停,定时,同时可以查看分布式情况下所有爬虫日志,查看爬虫执行情况等功能. 二 安装 部署 安装环境 ...

  8. Mac os x的发展

    OS X(前称Mac OS X)是苹果公司为麦金塔电脑开发的专属操作系统.Mac OS X于1998年首次推出,并从2002年起随麦金塔电脑发售.它是一套Unix基础的操作系统,包含两个主要的部分:核 ...

  9. JS实现跨域请求数据--CORS

    https://www.cnblogs.com/cjw-ryh/p/7674038.html?utm_source=debugrun&utm_medium=referral

  10. vue打包后出现的.map文件

    run dev build 打包项目后出现的list中的".map"文件最大. “.map”文件的作用:项目打包后,代码都是经过压缩加密的,如果运行时报错,输出的错误信息无法准确得 ...