Java并发编程实战Ⅰ

该系列文章是博主学习笔记,禁止转载,读书交流群:946541246
·

文章目录

  • Java并发编程实战一二章学习
    • 概念
      • 无状态
      • 竟态条件
      • 不变性条件
      • 相互约束的变量要在一个原子操作中进行
      • 复合操作

Java并发编程实战一二章学习

概念

无状态

既不包含任何域,也不包含任何对其他类中域的引用。
无状态一定是线程安全的
例如


@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 };
    }
}

计算过程中的临时状态仅存在于线程栈上的局部变量中,并且只由正在执行的线程访问。

竟态条件

当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竟态条件,最常见的竟态条件就是“先检查后执行”操作,即通过一个可能失效的结果来决定下一步的动作。

不变性条件

用于判断状态是有效的还是无效的。
例如下个例子,不变性条件就是lower <= upper。

public class NumberRange {
    // INVARIANT: lower <= upper
    private final AtomicInteger lower = new AtomicInteger(0);
    private final AtomicInteger upper = new AtomicInteger(0);

    public void setLower(int i) {
        // Warning -- unsafe check-then-act
        if (i > upper.get())
            throw new IllegalArgumentException("can't set lower to " + i + " > upper");
        lower.set(i);
    }

    public void setUpper(int i) {
        // Warning -- unsafe check-then-act
        if (i < lower.get())
            throw new IllegalArgumentException("can't set upper to " + i + " < lower");
        upper.set(i);
    }

    public boolean isInRange(int i) {
        return (i >= lower.get() && i <= upper.get());
    }
}

相互约束的变量要在一个原子操作中进行

当各个变量之间不是彼此独立的,而是某个变量的值会对其他变量的值产生约束。因此,当更新某一个变量时,需要在同一个原子操作中对其他变量同时进行更新。
例如

if(vector.contains(element)) {
	vector.add(element);
}

虽然vector的contains和add都是原子方法,但上面的操作中仍然存在静态条件,使用时需要额外的加锁机制

复合操作

例如i++
实际是:读取-》修改-》写入
如果在复合操作的执行过程中持有一把锁,那么会使复合操作成为原子操作

你可能感兴趣的:(Java并发编程实战)