java并发编程实战读书笔记

1、线程安全

指多个线程访问某个类时,不管运行时环境采用何种调度方式或线程将如何交替执行
,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为
,称这个类时线程安全的

2、线程安全核心

主要是对状态访问进行管理 ,尤其是共享的和可变的状态访问

注:

  • 对象的状态是存储在状态变量(实例或静态域中)的数据,换句话说,就是类中 的各种变量,包括静态和非静态变量
  • 无状态对象一定是线程安全的,如下图所示,没有状态变量,如代码1
@ThreadSafe
public class StatelessFactorizer extends GenericServlet implements Servlet {
    public void service(ServletRequest req, ServletResponse resp) {
        BigInteger i = extractFromRequest(req);
        BigInteger[] factors = factor(i);
        encodeIntoResponse(resp, factors);
    }
    void encodeIntoResponse(ServletResponse resp, BigInteger[] factors) {
    }
    BigInteger extractFromRequest(ServletRequest req) {
        return new BigInteger("7");
    }
    BigInteger[] factor(BigInteger i) {
        // Doesn't really factor
        return new BigInteger[] { i };
    }
}

3、竞态条件

当某个计算取决于多个线程的交替执行时,就会发生竞态条件----本质是基于一种可能失效的观察结果来做出判断或者执行某个计算,例如延迟初始化,如代码2,这里是依据instace的值来做判断

@NotThreadSafe
public class LazyInitRace {
    private ExpensiveObject instance = null;

    public ExpensiveObject getInstance() {
        if (instance == null)
            instance = new ExpensiveObject();
        return instance;
    }
}

4、避免竞态条件问题

总则:在某个线程修改该变量时,通过某种方式防止其他线程使用这个变量,从而保证其他线程只能在修改操作完成之前或之后使用和读取状态,而不是修改的过程中,最常见的方式是加锁,例如在代码2中的方法上加上synchronized

你可能感兴趣的:(java并发编程实战读书笔记)