Java并发之线程安全与无状态对象理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 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并发编程实战

猜你喜欢

转载自blog.csdn.net/zl_momomo/article/details/82252955