ad hoc java_Java并发编程--线程封闭(Ad-hoc封闭 栈封闭 ThreadLocal)
线程封闭
实现好的并发是一件困难的事情,所以很多时候我们都想躲避并发。避免并发最简单的方法就是线程封闭。什么是线程封闭呢?
就是把对象封装到一个线程里,只有这一个线程能看到此对象。那么这个对象就算不是线程安全的也不会出现任何安全问题。实现线程封闭有哪些方法呢?
1:ad-hoc线程封闭
这是完全靠实现者控制的线程封闭,他的线程封闭完全靠实现者实现。Ad-hoc线程封闭非常脆弱,没有任何一种语言特性能将对象封闭到目标线程上。
2:栈封闭
栈封闭是我们编程当中遇到的最多的线程封闭。什么是栈封闭呢?简单的说就是局部变量。多个线程访问一个方法,此方法中的局部变量都会被拷贝一分儿到线程栈中。所以局部变量是不被多个线程所共享的,也就不会出现并发问题。所以能用局部变量就别用全局的变量,全局变量容易引起并发问题。
public class Snippet {
public int loadTheArk(Collection candidates) {
SortedSet animals;
int numPairs = 0;
Animal candidate = null;
// animals被封闭在方法中,不要使它们逸出!
animals = new TreeSet(new SpeciesGenderComparator());
animals.addAll(candidates);
for (Animal a : animals) {
if (candidate == null || !candidate.isPotentialMate(a))
candidate = a;
else {
ark.load(new AnimalPair(candidate, a));
++numPairs;
candidate = null;
}
}
return numPairs;
}
}
3:ThreadLocal封闭
使用ThreadLocal是实现线程封闭的最好方法。ThreadLocal内部维护了一个Map,Map的key是每个线程的名称,而Map的值就是我们要封闭的对象。每个线程中的对象都对应着Map中一个值,也就是ThreadLocal利用Map实现了对象的线程封闭。
ad hoc java_Java并发编程--线程封闭(Ad-hoc封闭 栈封闭 ThreadLocal)相关推荐
- 判断线程是否执行完毕_Java并发编程 | 线程核心机制,基础概念扩展
源码地址:GitHub || GitEE 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效率.下面提供一个 ...
- 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析
文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...
- python 线程同步_Python并发编程-线程同步(线程安全)
Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...
- 并发编程——线程协作
并发编程--线程协作 前面学习了线程,那么并发编程中,如何协调多个线程来开发呢? Semaphore 信号量跟前面将的同步互斥解决方案--信号量是一个东西,这是JDK的信号量实现. 源码分析 ...
- Java 并发编程 -- 线程池源码实战
一.概述 小编在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写的太简单,只写了一点皮毛,要么就是是晦涩难懂,看完之后几乎都 ...
- 如何防止线程死锁java_Java 并发编程:如何防止在线程阻塞与唤醒时死锁
Java并发编程:多线程如何实现阻塞与唤醒 说到suspend与resume组合有死锁倾向,一不小心将导致很多问题,甚至导致整个系统崩溃.接着看另外一种解决方案,我们可以使用以对象为目标的阻塞,即利用 ...
- 【从入门到放弃-Java】并发编程-线程安全
概述 并发编程,即多条线程在同一时间段内"同时"运行. 在多处理器系统已经普及的今天,多线程能发挥出其优势,如:一个8核cpu的服务器,如果只使用单线程的话,将有7个处理器被闲置, ...
- 并发编程线程通信之管道流
前言 在并发编程中,需要处理两个问题:线程之间如何通信及线程之间如何同步.通知是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递. 在共享内存的并发模型里, ...
- C++并发编程线程间共享数据std::future和sd::promise
线程间共享数据 使用互斥锁实现线程间共享数据 为了避免死锁可以考虑std::lock()或者boost::shared_mutex 要尽量保护更少的数据 同步并发操作 C++标准库提供了一些工具 可以 ...
最新文章
- Failed to fetch http://mirrors.cloud.aliyuncs.com/
- java socket监控_ZeroMQ(java)中监控Socket
- 交换机的VACL测试
- Java使用String.format()实现补零
- Python学习:基本概念
- POJ - 1061 青蛙的约会(扩展欧几里得)
- Python基础语法:数据类型、进制转换、转义字符、字符编码、整数与浮点数运算规则、布尔型运算规则
- 网页简单上传图片 imgareaselect插件
- 备份恢复与同步(数据搬运专家)
- 部署Linux服务器实验报告,Linux服务器学习----tomcat 服务配置实验报告(一)
- 为什么80%的码农都做不了架构师?
- Linux的cron和crontab
- Eclipse3.5的使用配置
- 小语种nlp文本预处理——数据清洗
- 所有Windows原版系统的下载地址
- k3c官改刷openwrt_斐讯K3刷OpenWrt(Lede)
- python for line in file 只能读取一遍
- matlab如何打开word文档,matlab操作word
- 日语常用会话1000句
- mysql myd文件过大_Mysql数据文件大小超过4G了如何缩小优化
热门文章
- Your license has expired IDEA过期问题
- mysql sql dateadd函数_SQL DATEADD函数 (sqlserver 只更新表中年份,不改其他时间)...
- 为什么有时候双击excel表格里面的单元格的时候会跳到其它地方?
- 新零售餐饮风口正盛,食云集却在夹缝中求生?
- BarTender 打印机的控制详解
- matlab检验正交性,matlab-线性代数 判断 正交矩阵
- VM-CtenOS-8+Linux-8+LANMP环境中安装phpMyAdmin
- 【bzoj4292】 [PA2015]Równanie 乱搞
- Android穿山甲SDK接入信息流广告
- 自己动手写数据库系统:容灾恢复原理和容灾恢复日志的设计