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. 配置ASM以及创建恢复目录

    本次配置ASM沿用了搭建RAC的环境配置,系统选用CENTOS6.8 首先本地配置YUM,安装GRID集群件所需要的RPM包 [root@rac01 Packages]# cd /etc/yum.re ...

  2. python之if __name__ == '__main__'

    if __name__ == '__main__' 我们简单的理解就是: 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行.

  3. sqlserver2014两台不同服务器上数据库同步

    sqlserver2014两台不同服务器上数据库同步   同步了快一个月了,哈哈,因为途中比较麻烦,第一次,遇到烦的地方就停下了,今天终于同步成功了,哈哈,下面我就来介绍一下我实现两台数据库同步的过程 ...

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

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

  5. java 网络编(二)UDP的传输

    发送端: package cn.sasa.netDemo1; import java.io.IOException; import java.net.DatagramPacket; import ja ...

  6. java 集合(四)HashSet 与 LinkedHashSet

    查看源码: HashSet底层new 了HashMap 哈希表的结构: Demo: package cn.sasa.demo2; import java.util.HashSet; import ja ...

  7. 【托业】【新托业TOEIC新题型真题】学习笔记11-题库六-P7

    1.scam [skæm] n.骗局; 诡计; <美俚>诓骗; 故事;vt.欺诈; 诓骗; 2.interpersonal adj.人与人之间的; 人际的; 人与人之间的关系的; 涉及人与 ...

  8. 什么是BI

    最近在人人网上看到一篇非常好的文章,转载分享给大家. 原文链接:http://blog.renren.com/share/252753054/5619469778/3其文谈对BI的理解,杜绝“假”“大 ...

  9. percona顶级项目(针对数据库)

    percona顶级项目(针对数据库) 地址:https://github.com/Percona-Lab 1.mongodb_consistent_backupTool for getting con ...

  10. LigerUi折叠与展开

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...