java 单例模式之线程安全的饿汉模式和懒汉模式
转载博主:thankyou
https://blog.csdn.net/twj13162380953/article/details/53869983
理解:
饿汉式获取实例的步骤简单所以线程更安全。懒汉式只是不会在类加载时即创建静态对象而效率略高,而因此也导致有判断是否已创建对象环节会使线程变得不安全,需要加同步锁才能解决该问题。
单例模式
解决的问题:保证一个类在内存中的对象唯一性.
比如:多程序读取一个配置文件时,建议配置文件封装成对象。会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,
就需要该配置文件对象在内存中是唯一的。
如何保证对象唯一性呢?
思想:
1,不让其他程序创建该类对象。
2,在本类中创建一个本类对象。
3,对外提供方法,让其他程序获取这个对象。
步骤:
1,因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序就无法再创建该类对象;
2,就在类中创建一个私有并静态的本类的对象;
3,定义一个方法,返回该对象,让其他程序可以通过方法就得到本类对象。(作用:可控)
代码体现:
1,私有化构造函数;
2,创建私有并静态的本类对象;
3,定义公有并静态的方法,返回该对象。
饿汉模式:
- class Single{
- private Single(){} //私有化构造函数。
- private static Single s = new Single(); //创建私有并静态的本类对象。
- public static Single getInstance(){ //定义公有并静态的方法,返回该对象。
- return s;
- }
- }
//懒汉式:延迟加载方式。使用到的时候才回去初始化该对象
- class Single2{
- private Single2(){}
- private static Single2 s = null;
- public static Single2 getInstance(){
- if(s==null)
- s = new Single2();
- return s;
- }
- }
在多线程模式中,考虑到性能和线程安全问题,我们一般会选择下面两种比较经典的单例模式,在性能提高的同时,又保证了线程的安全.
1.static inner Class
2.dubble check instance
(饿汉模式)static inner Class-内部静态类的形式
- public class Singletion {
- private static class InnerSingletion {
- private static Singletion single = new Singletion();
- }
- public static Singletion getInstance(){
- return InnerSingletion.single;
- }
- }
(懒汉模式) dubble check instance-为确保线程安全,需要两次check
- public class DubbleSingleton {
- private static DubbleSingleton ds;
- public static DubbleSingleton getDs(){
- if(ds == null){
- try {
- //模拟初始化对象的准备时间...
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- synchronized (DubbleSingleton.class) {
- if(ds == null){
- ds = new DubbleSingleton();
- }
- }
- }
- return ds;
- }
- public static void main(String[] args) {
- Thread t1 = new Thread(new Runnable() {
- @Override
- public void run() {
- System.out.println(DubbleSingleton.getDs().hashCode());
- }
- },"t1");
- Thread t2 = new Thread(new Runnable() {
- @Override
- public void run() {
- System.out.println(DubbleSingleton.getDs().hashCode());
- }
- },"t2");
- Thread t3 = new Thread(new Runnable() {
- @Override
- public void run() {
- System.out.println(DubbleSingleton.getDs().hashCode());
- }
- },"t3");
- t1.start();
- t2.start();
- t3.start();
- }
- }
输出结果:
- 792363696
- 792363696
- 792363696
java 单例模式之线程安全的饿汉模式和懒汉模式的更多相关文章
- Java-设计模式-单例模式-饿汉模式、懒汉模式
//-------------------------------------------------------------饿汉模式--开始----------------------------- ...
- Java单例模式之饿汉模式与懒汉模式
单例模式是我们在开发软件的过程中经常用到的23中常用的java模式之一,主要的功能就是保证我们所使用的对象只有一个,这也在一方面减少了出错的可能性,增强了代码的健壮.单例模式一般来说有两种实现的方式, ...
- 设计模式-单例模式(Singleton Pattren)(饿汉模式和懒汉模式)
单例模式(Singleton Pattren):确保一个类在整个应用中只有一个实例,并提供一个全局访问点. 实现要点: 1. 私有化构造方法 2. 类的实例在类初始化的时候创建 3. 提供一个类方法, ...
- Java单例模式的线程安全问题
单例模式有两种书写模式:饿汉式和懒汉式. 1.饿汉式 class Single{ private final static Single s = new Single(); private Singl ...
- 单例模式之懒汉模式,懒汉模式之高效模式,DLC双判断模式
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; imp ...
- java单例模式(线程安全,效率高,双重推断)
这样的方法,在获取单利的时候,避免了线程锁,导致訪问该方法速度非常慢, 同是,防止了多线程同事房屋该方法就会产生多个实例的问题. 效率高.线程安全. public class TestInstance ...
- Java设计模式 - 单例模式 (懒汉方式和饿汉方式)
概念: Java中单例模式是一种常见的设计模式,单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的写法有好几种,这 ...
- java中的单例模式(懒汉式+饿汉式)
什么是单例模式: 单例模式既只能在自己本类中创建有且唯一的一个实例(姑且不考虑映射的情况)通过方法将该实例对外公开 第一种:单例模式-懒汉式 既调用getInstance()方法返回实例之前判断有没有 ...
- C++的单例模式与线程安全单例模式(懒汉/饿汉)
1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实 ...
随机推荐
- 11g RAC 如何备份OCR,利用备份恢复OCR,ocrdump
OCR备份 OCR的备份有2种方式,自动备份和手工备份. 自动备份策略: Oracle Clusterware 每隔4小时,CRSD 进程会自动对OCR 进行一次备份,在任意时刻,oracle 总会保 ...
- [转]前端网络(性能)监测工具berserkJS
berserkJS 是基于 Qt (C++跨平台库)开发的前端网络(性能)监测工具. 它的核心功能是通过内置 webkit 收集由页面实际网络请求相关数据. 偏重于页面上线前检测与评估. 页面性能分析 ...
- 利用src.rpm包修改源码后重新制作rpm包
1. 下载 .src.rpm包.例:https://repos.fedorapeople.org/repos/openstack/EOL/openstack-grizzly/epel-6/openst ...
- 2 ubuntu 16.04 安装Elastic Stack
一: 安装JAVA8 添加ppa sudo add-apt-repository ppa:webupd8team/java sudo apt-get update 安装oracle- ...
- Selenium并行启动多个浏览器
如果你对 Selenium 自动化测试已经非常熟悉,你仅仅需要一个快速上手来使程序运行起来.本章节的内容能满足不同的技术层次,但是如果你仅仅需要一个可以快速上手的指引,那么就显得有点多.如果是这样,你 ...
- jprofiler9.1.1 安装与配置
一.安装部分 安装包: 1.jprofiler_linux_9_1_1.rpm 2.jprofiler_windows-x64_9_1_1.exe 需要注意的是,Linux 和 Windows 安装的 ...
- Spring IOC 少
控制反转好处 IOC:控制反转也叫依赖注入,IOC利用java反射机制,AOP利用代理模式.所谓控制反转是指,本来被调用者的实例是有调用者来创建的,这样的缺点是耦合性太强,IOC则是统一交给sprin ...
- 报错:defined for 'courierAction_pageQuery' in namespace '/'Error creating bean with name 'cn.itcast.bos.web.action.base.CourierAction': Injection of autowired dependencies failed; nested exception is or
No qualifying bean of type [cn.itcast.bos.web.service.base.CourierService] found for dependency: exp ...
- RecommenderFilterSalaryResult
package org.andy.mymahout.recommendation.job; import java.io.BufferedReader; import java.io.File; im ...
- BLAST在Windows系统中本地化
简介 NCBI除了提供在线的Web BLAST序列比对服务外,还提供FTP方式下载序列比对工具.这允许在本地平台上针对从NCBI下载或本地创建的数据库执行BLAST搜索.这些实用程序没有图形用户界面, ...