天天看点

Java并发编程实践笔记之—线程封闭(Thread Confinement)

什么是线程封闭

  • 仅在单线程内访问数据,就不需要同步(可理解成“将对象封闭在线程中”)
  • 是实现线程安全性的最简单的方式之一
  • 应用1——Swing中大量使用了线程封闭技术。Swing的可视化组件和数据模型对象都不是线程安全的,Swing通过将它们封闭到Swing的事件分发线程中来实现线程安全性。Swing应用程序的许多并发错误就是由于错误地在另一个线程中使用了这些被封闭的对象
  • 应用2——JDBC的Connection对象不是线程安全的,服务器应用程序中,大多数请求由单个线程采用同步的方式来出来一个Connection对象,在Connection返回连接池之前,连接池不会将它分配给其他线程(注意,连接池是要线程安全的,因为连接池是有多个线程同时访问的)
  • Java及其核心库提供了一些机制来帮助维持线程的封闭性

Ad-hoc线程封闭

  • 非常脆弱,比较少用

栈封闭

  • 概念:局部变量的固有属性之一就是始终封闭在线程中,它们位于执行线程的栈中,其他线程就无法访问这个栈
  • 对于基本类型的局部变量,Java语言确保了无论如何都不会破坏封闭性
  • 对于对象引用的局部变量,程序员要注意以确保被引用的对象不会逸出

ThreadLocal类

  • 更规范的方法,使线程中的某个值与保存值的对象关联起来
  • 提供了get/set等方法,为每个使用该变量的线程都存有一份独立的副本
  • 如果你需要将一个单线程应用程序移植到多线程环境中,通过将共享的全局变量转换为ThreadLocal对象,就可以维持线程的安全性
  • 避免滥用

继续阅读