1.饿汉模式(立即加载模式)与多线程

不管需不需要用到实例都要去创建实例,即在类产生的时候就创建好实例

package com.thread;

/**
* 饿汉模式
*
* @author yyx 2019年8月21日
*/
public class EhanSingleton {
public EhanSingleton() { } private static EhanSingleton ehanSingleton = new EhanSingleton(); public static EhanSingleton getInstance() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ehanSingleton;
}
}
package com.thread;

public class MyThread extends Thread {
public static void main(String[] args) {
MyThread m1 = new MyThread();
MyThread m12 = new MyThread();
MyThread m13 = new MyThread(); m1.start();
m12.start();
m13.start();
} @Override
public void run() {
System.out.println(EhanSingleton.getInstance().hashCode());
} }
运行结果的一种:

507247953
507247953
507247953

在多线程下,算出来的结果每个对象的   hashcode的值是一样的,是线程安全的

2.懒汉模式(延迟加载模式)与多线程

需要用到创建实例了程序再去创建实例,不需要创建实例程序就“懒得”去创建实例

package com.thread;

/**
* 懒汉模式
*
* @author yyx 2019年8月21日
*/
public class LhanSingleton {
public LhanSingleton() { } private static LhanSingleton lhanSingleton; public static LhanSingleton getInstance() {
if (lhanSingleton == null) {
try {
Thread.sleep(3000);
lhanSingleton = new LhanSingleton();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
return lhanSingleton;
}
}
package com.thread;

public class MyThread extends Thread {
public static void main(String[] args) {
MyThread m1 = new MyThread();
MyThread m12 = new MyThread();
MyThread m13 = new MyThread(); m1.start();
m12.start();
m13.start();
} @Override
public void run() {
System.out.println(LhanSingleton.getInstance().hashCode());
} }
运行结果的一种:

1486308634
1560533534
507247953

懒汉模式在单线程中是符合单例模式的,不过在多线程环境中是不符合单例模式

3.懒汉模式线程安全的解决机制

3.1 同步代码块

package com.thread;

/**
* 懒汉模式
*
* @author yyx 2019年8月21日
*/
public class LhanSingleton {
public LhanSingleton() { } private static LhanSingleton lhanSingleton; public static LhanSingleton getInstance() {
if (lhanSingleton == null) {
synchronized (LhanSingleton.class) {
if (lhanSingleton == null) {
try {
Thread.sleep(3000);
lhanSingleton = new LhanSingleton();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
return lhanSingleton;
}
}

3.2 同步方法

package com.thread;

/**
* 懒汉模式,不推荐
*
* @author yyx 2018年8月21日
*/
public class LhanSingleton {
public LhanSingleton() { } private static LhanSingleton lhanSingleton; public static synchronized LhanSingleton getInstance() {
if (lhanSingleton == null) {
try {
Thread.sleep(3000);
lhanSingleton = new LhanSingleton();
} catch (InterruptedException e) {
e.printStackTrace();
} }
return lhanSingleton;
}
}

Java多线程-----单例模式在多线程中的使用用问题的更多相关文章

  1. UML和模式应用4:初始阶段(6)--迭代方法中如何使用用例

    1.前言 用例是UP和其他众多迭代方法的核心.UP提倡用例驱动开发. 2. 迭代方法中如何使用用例 功能需求首先定义在用例中 用例是迭代计划的重要部分,迭代是通过选择一些用例场景或整个用例来定义的 用 ...

  2. 在Visual Studio中使用用例图描述参与者与用例的关系

    在"在Visual Studio中使用用例图描述系统与参与者间的关系"中,使用用例图表示参与者与系统的关系,本篇体验参与者与用例(参与者要做的事情)的关系. 首先创建有关Custo ...

  3. Java多线程核心技术(五)单例模式与多线程

    本文只需要考虑一件事:如何使单例模式遇到多线程是安全的.正确的 1.立即加载 / "饿汉模式" 什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就是直接 ...

  4. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  5. Java多线程编程核心技术-第6章-单例模式与多线程-读书笔记

    第 6 章 单例模式与多线程 本章主要内容 如何使单例模式遇到多线程是安全的.正确的. 6.1 立即加载 / “饿汉模式” 什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就 ...

  6. Java多线程编程(2)--多线程编程中的挑战

    一.串行.并发和并行   为了更清楚地解释这三个概念,我们来举一个例子.假设我们有A.B.C三项工作要做,那么我们有以下三种方式来完成这些工作:   第一种方式,先开始做工作A,完成之后再开始做工作B ...

  7. Java——单例模式、多线程

    单例模式 单例模式练习 单例模式的分类 懒汉式 懒汉式相关练习 饿汉式 饿汉式相关练习 线程安全 使用双重检测机制实现线程安全的懒汉式 使用静态内部类实现线程安全的单例模式 多线程 多线程的三种方式 ...

  8. Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍

    1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...

  9. Java多线程4:Thread中的静态方法

    一.Thread类中的静态方法 Thread类中的静态方法是通过Thread.方法名来调用的,那么问题来了,这个Thread指的是哪个Thread,是所在位置对应的那个Thread嘛?通过下面的例子可 ...

随机推荐

  1. jquery validate强大的jquery表单验证插件

    jquery validate的官方演示和文档地址: 官方网站:http://jqueryvalidation.org/ 官方演示:http://jqueryvalidation.org/files/ ...

  2. Delphi 打开网址

    1. 通过iexplore.exe打开:ShellExecute(0, 'open', 'iexplore.exe', PChar('http://www.100xuekao.com'), '', S ...

  3. 实验四 Android程序设计

    20155224 实验四 Android程序设计 实验报告 实验报告封面: 课程:Java程序设计 班级:1652班 姓名:王高源 学号:20165225 指导教师:娄嘉鹏 实验日期:2018年5月1 ...

  4. 使用反向代理的http的请求流程

    此文章主要为刚接触反向代理的小伙伴梳理请求流程,以便更好的理解反向代理是何时工作的 流程 由于浏览器是有缓存的,所以本地的hosts文件的信息也会在浏览器端缓存 当客户端发起一个新的请求(例如:输入的 ...

  5. 【pyqtgraph】pyqtgraph-鼠标互动

    pyqtgraph绘图库官方文档学习-鼠标互动(mouse interaction) 鼠标互动 大多数使用pyqtgraph数据可视化的应用程序都会生成可以使用鼠标进行交互式缩放,平移和配置的小部件. ...

  6. Vue双向数据绑定原理分析(转)

    add by zhj: 目前组里使用的是前端技术是jQuery + Bootstrap,后端使用的Django,Flask等,模板是在后端渲染的.前后端没有分离,这种做法有几个缺点 1. 模板一般是由 ...

  7. Python中的下划线(转)

    译文原文:https://segmentfault.com/a/1190000002611411 原文地址这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线_的不同用法绝大 ...

  8. fatal error: vector: No such file or directory

    jni/mac.cpp:28:18: fatal error: vector: No such file or directory jni/mac.cpp:29:18: fatal error: me ...

  9. EOS config 大全

    https://eosfans.io/topics/930 bnet_plugin bnet-endpoint: 所监听的传入链接的端点. 默认:0.0.0.0:4321 bnet-follow-ir ...

  10. 96A

    #include <iostream> #include <string> #include <cctype> using namespace std; int m ...