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. Java之旅_面向对象_接口

    参考摘自:http://www.runoob.com/java/java-interfaces.html 接口(interface)在Java中是一个抽象类型,是抽象方法的集合. 一个类通过imple ...

  2. Java+selenium 如何下拉移动滚动条【实战】

    一.场景:在编写脚本过程中需要定位的元素,在界面的底部,需要拖拽下拉滚动条,再进行定位元素. 实现思路:用Selenium 里面的 scrollTo 方法实现 二.脚本示例: 1. 用例设计 @The ...

  3. 关于linux特殊含义的转义符\033

    格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo -e "\033[41;36m something here \033 ...

  4. 【JMeter】【性能测试】服务器性能监控

    下载插件 1.访问网址http://jmeter-plugins.org/downloads/all/,下载三个文件.其中JMeterPlugins-Standard和JMeterPlugins-Ex ...

  5. Machine Learning in action --LogisticRegession 逻辑回归

    本系列主要参考<机器学习实战>,使用python3编译环境,实现书中的相关代码. 1.基本算法 关于梯度上升算法和随机梯度上升算法的选择: 当数据集较小时,使用梯度上升算法: 当数据集较大 ...

  6. centos7安装webmin

    安装webmin准备centos7系统1.下载http://download.webmin.com/download/yum/选择:webmin-1.700-1.noarch.rpm 安装包 wget ...

  7. (1.7)mysql profiles分析

    mysql profiles分析 作用:记录会话查询SQL所用时间 1.开启 2.使用 [2.1]先使用一个查询 [2.2]然后再运行 show profiles; [2.3]查看执行过程中每个状态和 ...

  8. 类属性"get"必须声明主体,因为它未标记为 abstract 或 extern[解决方法]

    当在页面cs文件中,写类属性时,运行会碰到以下问题:CS0501: “ASP.default_aspx.Person.Level.get”必须声明主体,因为它未标记为 abstract 或 exter ...

  9. Kinect2.0获取数据

    最近事情真是多,今天抽空研究一下Kinec2.0的数据获取! 系统要求 https://developer.microsoft.com/en-us/windows/kinect/hardware-se ...

  10. ABAP 创建function model 返回参数为内表类型

    1:通过T-CODE  se11  创建一个structure   ZSTRU2. 2:   创建一个table type, 表名 ZTAB1. 3: 表的row type 选择 ZSTRU2 4: ...