Java多线程-----单例模式在多线程中的使用用问题
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多线程-----单例模式在多线程中的使用用问题的更多相关文章
- UML和模式应用4:初始阶段(6)--迭代方法中如何使用用例
1.前言 用例是UP和其他众多迭代方法的核心.UP提倡用例驱动开发. 2. 迭代方法中如何使用用例 功能需求首先定义在用例中 用例是迭代计划的重要部分,迭代是通过选择一些用例场景或整个用例来定义的 用 ...
- 在Visual Studio中使用用例图描述参与者与用例的关系
在"在Visual Studio中使用用例图描述系统与参与者间的关系"中,使用用例图表示参与者与系统的关系,本篇体验参与者与用例(参与者要做的事情)的关系. 首先创建有关Custo ...
- Java多线程核心技术(五)单例模式与多线程
本文只需要考虑一件事:如何使单例模式遇到多线程是安全的.正确的 1.立即加载 / "饿汉模式" 什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就是直接 ...
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
ASP.NET MVC Filters 4种默认过滤器的使用[附示例] 过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...
- Java多线程编程核心技术-第6章-单例模式与多线程-读书笔记
第 6 章 单例模式与多线程 本章主要内容 如何使单例模式遇到多线程是安全的.正确的. 6.1 立即加载 / “饿汉模式” 什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就 ...
- Java多线程编程(2)--多线程编程中的挑战
一.串行.并发和并行 为了更清楚地解释这三个概念,我们来举一个例子.假设我们有A.B.C三项工作要做,那么我们有以下三种方式来完成这些工作: 第一种方式,先开始做工作A,完成之后再开始做工作B ...
- Java——单例模式、多线程
单例模式 单例模式练习 单例模式的分类 懒汉式 懒汉式相关练习 饿汉式 饿汉式相关练习 线程安全 使用双重检测机制实现线程安全的懒汉式 使用静态内部类实现线程安全的单例模式 多线程 多线程的三种方式 ...
- Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍
1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...
- Java多线程4:Thread中的静态方法
一.Thread类中的静态方法 Thread类中的静态方法是通过Thread.方法名来调用的,那么问题来了,这个Thread指的是哪个Thread,是所在位置对应的那个Thread嘛?通过下面的例子可 ...
随机推荐
- navicat连接oracle失败
正常是成功的,失败的话,就是oci.dll的问题 在这边下载: https://www.oracle.com/technetwork/topics/winsoft-085727.html 然后找到对应 ...
- Python创建第一个django应用
在helloworld工程的基础上,我们准备创建第一个基于web的django应用,把这个应用名字命名为Guest 1.首先,是如何创建这个应用包,当然第一选择我们可以进入到cmd中,执行如下命令 ...
- 【Python爬虫】Requests库的基本使用
Requests库的基本使用 阅读目录 基本的GET请求 带参数的GET请求 解析Json 获取二进制数据 添加headers 基本的POST请求 response属性 文件上传 获取cookie 会 ...
- python练习题-day1
1.使用while循环输入 1 2 3 4 5 6 8 9 10 count=0 while count<10: count+=1 if count==7: continue print ...
- 前端 HTML body标签相关内容 常用标签 分割线 <hr>
分割线 <hr> <hr>标签用来在HTML页面中创建水平分隔线,通常用来分隔内容 <!DOCTYPE html> <html lang="en&q ...
- 预见2019吴晓波年终秀演讲PPT整理
在2018年倒数的第二天12月30日晚上7点在广东珠海横琴拉开帷幕,吴晓波以一场“预见2019”的年终盛典,和大家一起回望即将告别的跌宕一年,细数过去的焦虑和改变,瞭望未来的激越和走向.下面我们一起来 ...
- dedecms站内搜索页面调用最新文章
在页面中调用最新文章列表可以使新发布的文章更快被收录,如何在dedecms站内搜索页面调用最新文章呢? 1.登陆系统后台,进入“模板——模板管理——自定义宏标记”,点击“智能标记向导”进入智能标记生成 ...
- servlet中生成验证码
在servlet中生成验证码 package login; import java.awt.Color; import java.awt.Graphics; import java.awt.image ...
- OpenCV矩形检测
OpenCV矩形检测 需求:提取图像中的矩形,图像存在污染现象,即矩形区域不是完全规则的矩形. 思路一:轮廓法 OpenCV里提取目标轮廓的函数是findContours,它的输入图像是一幅二值图像, ...
- python中的下划线
在学习Python的时候,会不理解为什么在方法(method)前面会加好几个下划线,有时甚至两边都会加.在Python中下划线还具有 private 和 protected 类似的访问权限作用,下面我 ...