线程封闭

实现好的并发是一件困难的事情,所以很多时候我们都想躲避并发。避免并发最简单的方法就是线程封闭。什么是线程封闭呢?

就是把对象封装到一个线程里,只有这一个线程能看到此对象。那么这个对象就算不是线程安全的也不会出现任何安全问题。实现线程封闭有哪些方法呢?

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)相关推荐

  1. 判断线程是否执行完毕_Java并发编程 | 线程核心机制,基础概念扩展

    源码地址:GitHub || GitEE 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效率.下面提供一个 ...

  2. 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析

    文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...

  3. python 线程同步_Python并发编程-线程同步(线程安全)

    Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...

  4. 并发编程——线程协作

    并发编程--线程协作 ​ 前面学习了线程,那么并发编程中,如何协调多个线程来开发呢? Semaphore ​ 信号量跟前面将的同步互斥解决方案--信号量是一个东西,这是JDK的信号量实现. 源码分析 ...

  5. Java 并发编程 -- 线程池源码实战

    一.概述 小编在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写的太简单,只写了一点皮毛,要么就是是晦涩难懂,看完之后几乎都 ...

  6. 如何防止线程死锁java_Java 并发编程:如何防止在线程阻塞与唤醒时死锁

    Java并发编程:多线程如何实现阻塞与唤醒 说到suspend与resume组合有死锁倾向,一不小心将导致很多问题,甚至导致整个系统崩溃.接着看另外一种解决方案,我们可以使用以对象为目标的阻塞,即利用 ...

  7. 【从入门到放弃-Java】并发编程-线程安全

    概述 并发编程,即多条线程在同一时间段内"同时"运行. 在多处理器系统已经普及的今天,多线程能发挥出其优势,如:一个8核cpu的服务器,如果只使用单线程的话,将有7个处理器被闲置, ...

  8. 并发编程线程通信之管道流

    前言 在并发编程中,需要处理两个问题:线程之间如何通信及线程之间如何同步.通知是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递. 在共享内存的并发模型里, ...

  9. C++并发编程线程间共享数据std::future和sd::promise

    线程间共享数据 使用互斥锁实现线程间共享数据 为了避免死锁可以考虑std::lock()或者boost::shared_mutex 要尽量保护更少的数据 同步并发操作 C++标准库提供了一些工具 可以 ...

最新文章

  1. Failed to fetch http://mirrors.cloud.aliyuncs.com/
  2. java socket监控_ZeroMQ(java)中监控Socket
  3. 交换机的VACL测试
  4. Java使用String.format()实现补零
  5. Python学习:基本概念
  6. POJ - 1061 青蛙的约会(扩展欧几里得)
  7. Python基础语法:数据类型、进制转换、转义字符、字符编码、整数与浮点数运算规则、布尔型运算规则
  8. 网页简单上传图片 imgareaselect插件
  9. 备份恢复与同步(数据搬运专家)
  10. 部署Linux服务器实验报告,Linux服务器学习----tomcat 服务配置实验报告(一)
  11. 为什么80%的码农都做不了架构师?
  12. Linux的cron和crontab
  13. Eclipse3.5的使用配置
  14. 小语种nlp文本预处理——数据清洗
  15. 所有Windows原版系统的下载地址
  16. k3c官改刷openwrt_斐讯K3刷OpenWrt(Lede)
  17. python for line in file 只能读取一遍
  18. matlab如何打开word文档,matlab操作word
  19. 日语常用会话1000句
  20. mysql myd文件过大_Mysql数据文件大小超过4G了如何缩小优化

热门文章

  1. Your license has expired IDEA过期问题
  2. mysql sql dateadd函数_SQL DATEADD函数 (sqlserver 只更新表中年份,不改其他时间)...
  3. 为什么有时候双击excel表格里面的单元格的时候会跳到其它地方?
  4. 新零售餐饮风口正盛,食云集却在夹缝中求生?
  5. BarTender 打印机的控制详解
  6. matlab检验正交性,matlab-线性代数 判断 正交矩阵
  7. VM-CtenOS-8+Linux-8+LANMP环境中安装phpMyAdmin
  8. 【bzoj4292】 [PA2015]Równanie 乱搞
  9. Android穿山甲SDK接入信息流广告
  10. 自己动手写数据库系统:容灾恢复原理和容灾恢复日志的设计