版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zl_momomo/article/details/82252955
高并发访问会出现线程安全问题
线程安全
多线程访问某个状态变量和单线程访问执行结果相同,但效率更高。
要编写线程安全的代码,其核心问题要对状态访问操作进行管理,特别是对共享的(多个线程同时访问)和可变的(生命周期内变化)状态的访问。
对象的状态
"从非正式的意义上来说,对象的状态是指存储在状态变量(例如实例或静态域)中的数据"
本质上是对象内的属性,如属性status,更广义讲是可以被共享且可变数据
public Class Test{
private int status;
}
保证线程安全
1.保证共享对象状态访问的安全
a)使用同步机制,让对象的状态某一段时间只由一个线程操作。如关键字synchronized,volatile,显示锁,原子变量,同步类等。
2.不在线程之间共享状态变量
a)线程封闭技术
一种比较规范的方法是使用ThreadLocal对象。
如JDBC的Connection对象,每一个线程从连接池中获得Connection对象,拥有独立的Connection,当然连接池技术远远复杂。
private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>(){
@Override
protected Connection initialValue() {
return DriverManager.getConnection(DB_URL);
}
};
public static Connection getConnetion(){
return connectionHolder.get();
}
3.将状态变量修改为不可变的变量
使用final关键字
无状态对象
一个无状态的servlet示例,它既不包含任何域,也不包含任何对其他类中域的引用。
public class StatelessFactorizer implements Servlet {
public void service(ServletRequest req, ServletResponse resp) {
Biglnteger i = extractFromRequest(req);
Biglnteger[] factors = factor(i) ;
encodelntoResponse(resp, factors) ;
}
}
常见的Servlet和springmvc的Controller,我们避免向其中添加共享变量,来保证线程安全。
无状态对象一定是线程安全的,线程安全不一定是无状态对象
参考:java并发编程实战