共计 977 个字符,预计需要花费 3 分钟才能阅读完成。
线程封闭
当访问共享的可变数据时,通常需要使用同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据,就不要同步。这种技术成为线程封闭(Thread Confinement)。
Ad-hoc 线程封闭
Ad-hoc 线程封闭是指维护线程封闭的职责完全是由程序自己来承担。
栈封闭
栈封闭是线程封闭的一种特例,在栈封闭中,只能通过局部变量才能访问对象。
ThreadLocal 类
ThreadLocal 提供了 set 和 get 等访问接口或方法,这些方法为每个使用该变量的线程都存有一份独立的副本,因此 get 总是返回由当前执行线程在调用 set 设置的最新值。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* ConnectionDispenser
* <p/>
* Using ThreadLocal to ensure thread confinement
*
* @author Brian Goetz and Tim Peierls
*/
public class ConnectionDispenser {
static String DB_URL = "jdbc:mysql://localhost/mydatabase";
private ThreadLocal<Connection> connectionHolder
= new ThreadLocal<Connection>() {public Connection initialValue() {
try {return DriverManager.getConnection(DB_URL);
} catch (SQLException e) {throw new RuntimeException("Unable to acquire Connection, e");
}
};
};
public Connection getConnection() {return connectionHolder.get();
}
}
不变性
满足同步需求的另一种方法是使用不可变对象。1,对象创建以后其状态就不能修改。2,对象的所有域都是 final 类型。3,对象是正确创建的。
Final 域
关键字 final 可以视为 C ++ 中 const 机制的一种受限版本,用于构造不可变对象。(引用不可变,引用的对象是可变的)
正文完