线程封闭简述

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

Ad-hoc线程封闭:维护线程封闭性的职责完全由程序的实现来承担。Ad-hoc线程封闭是非常脆弱的,因为没有任何一种语言特性,例如可见性修饰符合局部变量,能将对象封闭到目标线程上。而且,对线程封闭对象的引用通常保存在公有变量中。由于Ad-hoc线程封闭的脆弱性,因此在程序中尽量少使用它,在尽可能的情况下,应该使用更强的线程封闭技术(eg.栈封闭或ThreadLocal类)。

栈封闭:栈封闭是线程封闭的一种特例,在栈封闭中,只能通过局部变量才能访问对象。正如封装能使得代码更容易维持不变形条件那样,同步变量也能使对象更易于封闭在线程中。局部变量的固有属性之一就是封闭在执行线程中。它们位于执行线程的栈中,其他线程无法访问这个栈。

TreadLocal类:维持线程封闭性的一种更规范方法是使用TreadLocal,这个类能使线程中的某个值与保存值得对象关联起来。TheadLocal提供了get和set等访问接口或方法,这些方法为每个使用该变量的线程都存在一份独立的副本,因此get总是返回由当前执行线程在调用set时设置的最新值。TheadLocal对象通常用于防止对可变的单实例变量或全局变量进行共享。例如,在单线程应用程序中可能会维持一个全局的数据库连接,并在程序启动时初始化这个连接对象,从而避免在调用每个方法时都要传递一个Connection对象。由于JDBC的连接对象不一定是线程安全的,因此,当多线程应用程序在没有协同的情况下使用全局变量时,就不是线程安全的。通过将JDBC的连接保存到ThreadLocal对象中,每个线程都会拥有属于自己的连接。

猜你喜欢

转载自blog.csdn.net/qq_32647655/article/details/102910345