线程封闭

  如果仅仅在单线程内访问数据,就不需要同步,这种技术被称为线程封闭,它是实现线程安全性的最简单的方式之一。当某个对象封闭在一个线程中时,这种方法将自动实现线程安全性,即使被封闭的对象本生不是线程安全的。

  实现好的并发是一件困难的事情,所以很多时候我们都想躲避并发。避免并发最简单的方法就是线程封闭。什么是线程封闭呢?
  就是把对象封装到一个线程里,只有这一个线程能看到此对象。那么这个对象就算不是线程安全的也不会出现任何安全问题。实现线程封闭有哪些方法呢?

1:ad-hoc线程封闭

  这是完全靠实现者控制的线程封闭,他的线程封闭完全靠实现者实现。也是最糟糕的一种线程封闭。所以我们直接把他忽略掉吧。

2:栈封闭

  栈封闭是我们编程当中遇到的最多的线程封闭。什么是栈封闭呢?简单的说就是局部变量。多个线程访问一个方法,此方法中的局部变量都会被拷贝一分儿到线程栈中。所以局部变量是不被多个线程所共享的,也就不会出现并发问题。所以能用局部变量就别用全局的变量,全局变量容易引起并发问题。局部变量的固有属性之一就是封闭在执行线程中。它们位于执行线程栈中,其它线程无法访问这个线程栈。栈封闭也被称为线程内部使用或线程局部使用。

3:ThreadLocal封闭

使用ThreadLocal是实现线程封闭的最好方法,有兴趣的朋友可以研究一下ThreadLocal的源码,其实ThreadLocal内部维护了一 个Map,Map的key是每个线程的名称,而Map的值就是我们要封闭的对象。每个线程中的对象都对应着Map中一个值,也就是ThreadLocal 利用Map实现了对象的线程封闭。

  总之,当我们要用线程封闭来避免并发问题的时候,最好使用的就是 【栈封闭】 和 【ThreadLocal】。

转载于:https://www.cnblogs.com/wxgblogs/p/5463419.html

JAVA并发编程实战---第三章:对象的共享(2)相关推荐

  1. java并发编程实战-第三章-对象的共享

    3.1可见性 首先我们需要知道的是,java的线程都有自己独立的缓存,线程之间进行共享变量的交互是通过自身和缓存和主存的交互实现的. 如果线程的每次更改缓存都刷入主存,主存每次被一个线程的缓存修改,都 ...

  2. JAVA并发编程实战---第三章:对象的共享

    在没有同步的情况下,编译器.处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整.在缺乏足够同步的多线程程序中,要对内存操作的执行顺序进行判断几乎无法得到正确的结果. 非原子的64位操作 当 ...

  3. Java并发编程实战 第4章 对象的组合

    Java监视器模式 java监视器模式就是在将共享的数据封装在一个类里面,然后然后所有访问或者修改这些数据的方法都标注为synchronize. 车辆追踪模拟: 使用监视器模式: CarTracker ...

  4. 【JAVA并发编程实战】1、对象的共享

    1.栈封闭 在栈封闭中,只能通过局部变量才能访问对象. 所谓栈封闭就是把变量的声明以及应用都局限在一个局部线程中,在这个局部线程中声明和实例化的对象对于线程外部是不可见的,这个局部线程的栈,无法被任何 ...

  5. Java并发编程实战笔记2:对象的组合

    设计线程安全的类 在设计现车让安全类的过程之中,需要包含以下三步: 找出构成对象状态的所有变量 找出约束状态变量的不变性条件 建立对象状态的并发访问策略 实例封闭 通过封闭机制与合适的加锁策略结合起来 ...

  6. Java并发编程实战 第14章 构建自定义的同步工具

    状态依赖性 定义:只有满足特定的状态才能继续执行某些操作(这些操作依赖于固定的状态,这些状态需要等待别的线程来满足). FutureTask,Semaphroe,BlockingQueue等,都是状态 ...

  7. java并发编程实战wwj----------第三阶段-------------CompletableFuture---------------56-59

    代码: 我找的博客:https://www.cnblogs.com/happyliu/archive/2018/08/12/9462703.html 第二段代码: 这里设置的是守护线程. 代码: pa ...

  8. Java并发编程实战 第13章 显式锁

    接口Lock的实现类: ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock Reentra ...

  9. java并发编程实战wwj----------第三阶段-------------ConcurrentHashMap----------------73

    红黑树的总结:https://www.jianshu.com/p/5dbaa6707017 链表+数组+红黑树. 首先看下node的数据结构: static class Node<K,V> ...

最新文章

  1. liferay和cas系统集成
  2. python操作Elasticsearch7.17.0
  3. HelloCharts-android 之饼状图的使用
  4. HarmonyOS之常用组件TextField的功能和使用
  5. linux sed 冒号,linux sed 总结
  6. 交叉编译出现skipping incompatible_交叉编译bluez-5.50
  7. Basic concepts behind Web Audio API
  8. 【备战NOIP】[算法总结] 二分查找
  9. 较流行的4个开源协议
  10. javascript中的isNaN()
  11. SQL:PostgreSQL设置自增序列
  12. linux 流场分析软件,scSTREAM | 通用流体分析软件
  13. 科技论文写作经验之谈
  14. 【转载】为什么用交叉线而不是直通线连接相同的设备
  15. powerdesigner与mysql_powerdesigner、mysql
  16. 【历史上的今天】7 月 18 日:英特尔成立;万维网上传了第一张照片;eBay 分拆 PayPal
  17. WARN: Establishing SSL connection without server‘s identity verification
  18. 浏览器油猴插件Tampermonkey下载安装
  19. javaGUI游戏教程--人物控制
  20. payssion支付

热门文章

  1. N Queen(代码、分析、汇编)
  2. php编译成二进制文件_2020年小米高级 PHP 工程师面试题
  3. 1.1.1.1校园网_Apache Flink 1.11.0 重要功能全面解析
  4. lisp捕捉垂足_定位-'Cal计算器
  5. 论ACM ICPC_Ruins He
  6. 114. 二叉树展开为链表 golang
  7. 318. 最大单词长度乘积 golang
  8. malloc和calloc的区别
  9. JAVA的值传递问题
  10. Django模型定义参考