懒汉模式为什么是线程安全的?这个大家基本都能看懂,加了锁了嘛!
饿汉模式为什么是安全的?因为静态对象是在类加载中就初始化了。
那为什么类加载过程是线程安全的呢?
之前没有考虑过,现在知道了,因为loadClass对象加了锁了
所以说饿汉模式是不加锁的,是不准确的
有答案说,使用ThreadLocal可以做到不加锁就做到线程安全的单例模式,但是这样的单例得出的只能保证线程内部的单例,多线程之间的数据不是单例的

当然,饿汉模式懒汉模式以及静态内部类模式就真的能做到单例?
也不是,使用反射或者序列化的方式,就可以做到多例
如何解决,构造器中加入首次判断(双重锁试用下,保证线程安全)以及加一个readResolve方法

 protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}

ThreadLocal的优点:
线程内安全
每个线程的ThreadLocal都是自己独有的,不用考虑线程安全问题
不用经常创建新对象,ThreadLocal的数量和线程池内的线程数一致

单例模式如何确保线程安全相关推荐

  1. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

  2. C++单例模式与线程安全

    C++单例模式与线程安全 最简单的单例模式可以是 // single thread safe version class Singleton {public:static Singleton* Get ...

  3. 用模板实现单例模式(线程安全)、模板方式实现动态创建对象

    一.用模板实现单例模式 在前面的文章中,用过多种方法实现单例模式,现在用模板方式来实现: 为了实现线程安全,需要在linux 下使用pthread_mutex_t 加锁,请使用g++ 编译并需要链接 ...

  4. 如何看待Spring下单例模式与线程安全的矛盾

    前言 有多少人在使用Spring框架时,很多时候不知道或者忽视了多线程的问题?   因为写程序时,或做单元测试时,很难有机会碰到多线程的问题,因为没有那么容易模拟多线程测试的环境.那么当多个线程调用同 ...

  5. 单例模式懒汉式(线程安全写法)

    package com.atguigu.java1;/*** 使用同步机制将单例模式中的懒汉式改写为线程安全的** @author shkstart* @create 2019-02-15 下午 2: ...

  6. 双重检查锁实现单例模式的线程安全问题

    一.结论 双重校验锁的单例模式代码如下: public class Singleton { private static Singleton singleton; private Singleton( ...

  7. 单例模式与线程安全问题浅析

    近期看到到Struts1与Struts2的比較.说Struts1的控制器是单例的,线程不安全的:Struts2的多例的,不存在线程不安全的问题.之后又想到了之前自己用过的HttpHandler... ...

  8. spring单例模式与线程安全问题的解决方案

    一句话总结:1:spring容器创建对象的方式是单例的 2:spring单例模式的安全问题是使用ThreadLocal解决的 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行 ...

  9. Spring——spring单例模式的线程安全

    1.有状态的与无状态的bean 有状态就是有数据存储功能. 有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的. 无状态就是一次操作不能保存数据. 无状态对 ...

  10. 单例模式及其线程安全问题

    目录 ​ 1.设计模式 2.饿汉模式 3.懒汉模式 4.线程安全与单例模式 1.设计模式 设计模式是什么? 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案 这些解决方案是众多软件开发人 ...

最新文章

  1. 用notepad++怎样批量添加引号
  2. 使用nmap-converter将nmap扫描结果XML转化为XLS实战
  3. IT规划的企业应用实践(10)研究的范围和限制
  4. 进程控制块PCB结构体 task_struct 描述
  5. java 如何去掉http debug日志_你居然还去服务器上捞日志,搭个日志收集系统难道不香吗?...
  6. api 微信内置浏览器js_微信小程序和HTML的区别
  7. leetcode51. N皇后
  8. JavaScript中一些常用的方法整理
  9. python3使用pickle读取文件提示TypeError或者UnicodeDecodeError的解决办法
  10. 【练习8.7】cvGoodFeaturesToTrack确定图像强角点、cvFindCornerSubPix亚像素级角点检测...
  11. 基于LabVIEW和PCI板卡的运动控制实现
  12. c语言上机南开100题,南开100题上机c语言
  13. 三诺 n20g 微型计算机,入门级音箱再现经典 三诺N-20GIII评测
  14. RISC-V嵌入式开发入门篇1:RISC-V GCC工具链的介绍
  15. win系统连接交换机并设置固定ip地址
  16. pandas模块DataFrame数据结构行数据的获取
  17. pppd详解_pppd拨号脚本说明文档
  18. alert弹框DeprecationWarning
  19. 普利姆算法 修路问题
  20. waf怎么读_1.如何绕过WAF(Web应用防火墙)

热门文章

  1. node.js接入微信公众号开发
  2. Excel怎么将两列数据合并成一列
  3. Pyqt通过鼠标滚轮进行缩放界面
  4. Markdown中永久嵌入bs64图片,python PIL等比列强压缩后将图片转换为bs64,2M直接压成100k
  5. 路由备份和路由聚合综合实验
  6. python二元一次方程组用鸡兔同笼的思路来写编程_3 应用二元一次方程组——鸡兔同笼 教学设计...
  7. python模拟点击屏幕ios_python模拟点击可以在ios中实现吗?
  8. 如何拯救k8s镜像分发的阿喀琉斯之踵
  9. 科学-建筑学:建筑学百科
  10. 家庭必备,轻、快、好用的WIN10自带虚拟机