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嘛?通过下面的例子可 ...
随机推荐
- Java之旅_面向对象_接口
参考摘自:http://www.runoob.com/java/java-interfaces.html 接口(interface)在Java中是一个抽象类型,是抽象方法的集合. 一个类通过imple ...
- Java+selenium 如何下拉移动滚动条【实战】
一.场景:在编写脚本过程中需要定位的元素,在界面的底部,需要拖拽下拉滚动条,再进行定位元素. 实现思路:用Selenium 里面的 scrollTo 方法实现 二.脚本示例: 1. 用例设计 @The ...
- 关于linux特殊含义的转义符\033
格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo -e "\033[41;36m something here \033 ...
- 【JMeter】【性能测试】服务器性能监控
下载插件 1.访问网址http://jmeter-plugins.org/downloads/all/,下载三个文件.其中JMeterPlugins-Standard和JMeterPlugins-Ex ...
- Machine Learning in action --LogisticRegession 逻辑回归
本系列主要参考<机器学习实战>,使用python3编译环境,实现书中的相关代码. 1.基本算法 关于梯度上升算法和随机梯度上升算法的选择: 当数据集较小时,使用梯度上升算法: 当数据集较大 ...
- centos7安装webmin
安装webmin准备centos7系统1.下载http://download.webmin.com/download/yum/选择:webmin-1.700-1.noarch.rpm 安装包 wget ...
- (1.7)mysql profiles分析
mysql profiles分析 作用:记录会话查询SQL所用时间 1.开启 2.使用 [2.1]先使用一个查询 [2.2]然后再运行 show profiles; [2.3]查看执行过程中每个状态和 ...
- 类属性"get"必须声明主体,因为它未标记为 abstract 或 extern[解决方法]
当在页面cs文件中,写类属性时,运行会碰到以下问题:CS0501: “ASP.default_aspx.Person.Level.get”必须声明主体,因为它未标记为 abstract 或 exter ...
- Kinect2.0获取数据
最近事情真是多,今天抽空研究一下Kinec2.0的数据获取! 系统要求 https://developer.microsoft.com/en-us/windows/kinect/hardware-se ...
- ABAP 创建function model 返回参数为内表类型
1:通过T-CODE se11 创建一个structure ZSTRU2. 2: 创建一个table type, 表名 ZTAB1. 3: 表的row type 选择 ZSTRU2 4: ...