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修饰的成员变量 一 ...
随机推荐
- myeclipse上down出的svn项目,文件后面不显示版本号和修改人
找到 windows ->preferences->General->Appearance->Lable Decorations 下拉找到svn 勾选上
- esp32编程第一例 hollow word
#include<stdio.h>#include"freertos/FreeRtos.h"#include"freertos/task.h"#in ...
- TabBarIOS
参考:http://blog.csdn.net/wmmhwj/article/details/68483592 import React, { Component } from 'react';imp ...
- angular5给懒加载模块添加loading
在根组件的构造函数中直接执行: this.router.events.subscribe(event=>{ if(event instanceof RouteConfigLoadEnd) { t ...
- 关于浏览器localhost点击wamp项目跳转出错
www目录下index.php399行代码 $handle=opendir("."); $projectContents = ''; while (($file = readdir ...
- ES6新特性整理,你需要了解的ES6知识
ES6是新版本JavaScript语言的标准,上一次标准的制订还是2009年出台的ES5.目前ES6的标准化工作已经完成,14年12月份放出了正式版本. 目前主流的浏览器都支持运行ES6代码,如果你的 ...
- mysql语句插入前判断数据是否重复
在mysql中插入数据有时需要判断数据插入是否重复 语句编写:insert into 表(相应字段) select 相应字段 from dual where not exists (select 相应 ...
- C# 直接创建一个DataTable,并为之添加数据(自定义DataTable) 转
DataTable dt=new DataTable("cart"); DataColumn dc1=new DataColumn("prizename",Ty ...
- SC OpenService 失败5:拒绝访问
当我们在cmd里使用 sc delete 服务名 ,来删除服务的时候,报错误,SC OpenService 失败5:拒绝访问. 这似乎是因为权限不够,解决方法. 首先,我们必须先取得管理员权限,以 ...
- 浅谈flex布局
Flex布局,俗称弹性布局,有了这个布局,咱们做的事情很多,以前那些很难实现比如说垂直居中之类都不存在了. 盒模型布局依赖于float,display,定位之类的方式来布局,这种的布局对一些特殊布局来 ...