线程封闭

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

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

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. 零知识证明实践教程,第一部分
  2. 开源云计算mysql_云计算-开源数据库-SQL2
  3. Windows 技术篇-减少对视频相关服务的cpu分配,减少cpu占用率
  4. linux无法打开共享对象文件或目录,linux - libmodbus.so.5:无法打开共享对象文件:没有这样的文件或目录 - 堆栈内存溢出...
  5. 机器学习之格式变化——reshape(-1,1)
  6. iOS Dev (60) 怎样实现 UITextView 中的 placeHolder
  7. P2P 漏洞曝光,数以百万计的物联网设备被入侵!
  8. 一个nginx 502问题解决方案
  9. x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1
  10. plc 上位机编译算法_基于西门子PLC的Socket通信深度剖析
  11. dpt原来英文是什么_今天才发现!原来微信还可以翻译文字,还不知道就可惜了...
  12. javascript笔记——图片大小检测
  13. 什么是智能标签?DevExpress WPF控件这份入门指南请查收
  14. OneApiConnect通讯demo,fins欧姆龙协议实现
  15. Spectral Algorithm
  16. 阶梯压测线程 jp@gc - Stepping Thread Group (deprecated)
  17. GateWay简介及使用
  18. onmouseover 和onmousemove的区别
  19. 第六届 虚拟漫游 题目
  20. 将Markdown转化为图片

热门文章

  1. JS实现五星好评效果
  2. python实现视频播放器_对目前的视频播放器不满意?教你用Python做一个视频播放器...
  3. 我与刘强东的故事:他的1000亿和我的5000万
  4. 从原型图到成品:步步深入 CSS 布局
  5. ”去他丫的北上广,老子要去成都定居了!“一名33岁老码农有话说
  6. 云终端ncomputingl300服务器,fl300云终端服务器(share fl300)
  7. 网络流量监控器mrtg全攻略
  8. 如何编辑PDF文件?
  9. 新研究评估Masimo SedLine(R)脑功能监护仪能否预测心跳骤停后ICU患者的神经系统转归和长期生存
  10. 使用NoteExpress做文献管理