设计模式课程 设计模式精讲 8-10 单例设计模式-ThreadLocal线程单例
1 课程讲解
1.1 应用场景
2 代码演练
2.1 threadLocal应用
1 课程讲解
1.1 应用场景
多线程的时候:
使用同步锁使用时间换空间的方式,(线程排队时间比较长)
而使用threadlocal使用空间换时间的方式。
基于threadlocal的单例模式,为每一个线程提供了一个对象,多线程访问的时候不会相互影响。
基于ThreadLocal的单例实现,数据库连接池的这种应用场景直接得提高了并发量,并且隔离了线程,不至于因为某一线程数据库连接断开造成全局断开,直接得提高了应用的容错率。但是代码层面要避免混用不同线程产生的单例。
自己理解:其实这种带引号的单例模式(threadLocal)已经不能称为单例模式了,因为同一个单例类,取出来的对象已经不一样了
2 代码演练
2.1 threadLocal应用
测试类:
package com.geely.design.pattern.creational.singleton; import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException; public class Test { public static void main(String [] args){
Thread thread1 = new Thread(new T());
Thread thread2 = new Thread(new T());
thread1.start();
thread2.start();
System.out.println("结束了!!!");
} }
线程类:
package com.geely.design.pattern.creational.singleton; /**
* 注:该类为线程类,调用LazySingleton
*/
public class T implements Runnable{ @Override
public void run() {
/* StaticInnerClassSingleton staticInnerClassSingleton = StaticInnerClassSingleton.getInstance();*/
ThreadLocalInstance threadLocalInstance = ThreadLocalInstance.getInstance();
System.out.println(Thread.currentThread().getName()+"==="+threadLocalInstance);
}
}
实体类:
package com.geely.design.pattern.creational.singleton; public class ThreadLocalInstance {
/**
* 预防外部类 实例化本类
*/
private ThreadLocalInstance(){ } public static final ThreadLocal<ThreadLocalInstance> threadLocalInstance
= new ThreadLocal<ThreadLocalInstance>(){
/**
* 重写初始化方法
*/
@Override
protected ThreadLocalInstance initialValue(){
return new ThreadLocalInstance();
}
}; /**
* 获得实例
* @return
*/
public static ThreadLocalInstance getInstance(){
return threadLocalInstance.get();
}
}
引用类:
/**
* Returns the value in the current thread's copy of this
* thread-local variable. If the variable has no value for the
* current thread, it is first initialized to the value returned
* by an invocation of the {@link #initialValue} method.
*
* @return the current thread's value of this thread-local
*/
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
} static class ThreadLocalMap { /**
* The entries in this hash map extend WeakReference, using
* its main ref field as the key (which is always a
* ThreadLocal object). Note that null keys (i.e. entry.get()
* == null) mean that the key is no longer referenced, so the
* entry can be expunged from table. Such entries are referred to
* as "stale entries" in the code that follows.
*/
static class Entry extends WeakReference<ThreadLocal> {
/** The value associated with this ThreadLocal. */
Object value; Entry(ThreadLocal k, Object v) {
super(k);
value = v;
}
}
}
打印日志:
结束了!!!
Thread-0===com.geely.design.pattern.creational.singleton.ThreadLocalInstance@120f0be
Thread-1===com.geely.design.pattern.creational.singleton.ThreadLocalInstance@75dfb148 Process finished with exit code 0
设计模式课程 设计模式精讲 8-10 单例设计模式-ThreadLocal线程单例的更多相关文章
- 【设计模式】Java设计模式精讲之原型模式
简单记录 - 慕课网 Java设计模式精讲 Debug方式+内存分析 & 设计模式之禅-秦小波 文章目录 1.原型模式的定义 原型-定义 原型-类型 2.原型模式的实现 原型模式的通用类图 原 ...
- 设计模式课程 设计模式精讲 7-2 建造者模式Coding
1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...
- 设计模式课程 设计模式精讲 17-2 模板方法模式coding
1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...
- Java设计模式精讲之UML急速入门
简单记录 - 慕课网 - Java设计模式精讲 Debug方式+内存分析 文章目录 第2章 UML急速入门 2-1.UML简单入门 UML定义 UML特点 UML 2.2分类 UML类图 理解泛化.实 ...
- Java 基础入门随笔(10) JavaSE版——单例设计模式
设计模式:对问题行之有效的解决方式.其实它是一种思想. 1.单例设计模式. 解决的问题:就是可以保证一个类在内存中的对象唯一性.(单个实例) 使用单例设计模式需求:必须对于多个程序使用同一个配置信息对 ...
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...
- 北风设计模式课程---开放封闭原则(Open Closed Principle)
北风设计模式课程---开放封闭原则(Open Closed Principle) 一.总结 一句话总结: 抽象是开放封闭原则的关键. 1."所有的成员变量都应该设置为私有(Private)& ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
- 单例设计模式(Singleton)
一.单例设计模式介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法) 例如:Hibernate的Se ...
随机推荐
- 谈谈对Spring IOC的理解(转载)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- codeforces Beautiful Numbers
来源:http://codeforces.com/problemset/problem/1265/B B. Beautiful Numbers You are given a permutat ...
- 使用MQTT.fx客户端接入阿里云
一.前期准备. 1.关于MQTT连接的属性:https://www.cnblogs.com/mhtc/p/11112153.html 2.关于阿里云配置工具的使用:https://www.cnblog ...
- C语言知识点记录
1,栈底指针不变,栈顶指针变化. 2,结构化程序包括:顺序,分支,循环. 3,详细设计的任务是为软件结构图的每一个模块确定实现算法和局部数据结构. 4,数据操纵语言:负责数据的操纵,包括查询及增,删, ...
- ASP.NET Core搭建多层网站架构【5-网站数据库实体设计及映射配置】
2020/01/29, ASP.NET Core 3.1, VS2019, EntityFrameworkCore 3.1.1, Microsoft.Extensions.Logging.Consol ...
- css 属性值 calc (目前只了解部分)
移动端页面,有如下图的需求: 实现效果: 实现 css 代码: .list {/*父级*/ border: 1px solid #E9EAEA; border-radius: 2px; backgro ...
- 工具 - 正则Cheat sheet
- EXPOSE ocker run -P 时,会自动随机映射 EXPOSE 的端口
EXPOSE 声明端口 格式为 EXPOSE <端口1> [<端口2>...]. EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用 ...
- WLC-Right to Use Licensing
1.RTU的介绍 RTU licensing是没有和UDI(unique device identifier)或SN绑定的一种模型.在你接受了最终用户许可协议(EULA)后,使用RTU license ...
- java中静态初始化块的执行顺序
在java中,其应该是先于所有的方法执行. 下面是测试代码: public class Test1 { static{ System.out.println("执行静态初始化块test1.. ...