您的位置:首页 > 编程语言 > Java开发

java并发编程学习 第三章

2018-02-03 21:21 169 查看
第三章

可见性,重排序:
在没有同步的情况下,编译器,处理器以及运行时等都可能对操作的执行顺序

进行一些意想不到的调整。
失效数据:即在缺乏同步的程序中,试图访问一个变量的已经失效的值。

JVM要求变量的读取操作和写入都必须是原子操作,但对于非volatile类型的long,double变量,JVM允许将64位的读操作或写操作分解为两个32位的操作。

Volatile确保将变量的更新操作通知到其他线程。它只能保证可见性
而加锁机制可以保证可见性和原子性。

发布一个对象:使对象能够在当前作用域之外的代码中使用。例如将一个指向该对象的引用保存到其他代码可以访问的地方,或者在某个非私有的方法中返回该引用,或者将引用传递到其他类的方法中。

线程封闭:仅在单线程内访问数据,不共享数据。
ad-hoc线程封闭:维护线程封闭的职责完全由程序实现来承担。
栈封闭:针对基本类型
ThreadLocal
不变性:满足同步需求的使用不可变对象。
不可变对象一定是线程安全的。
对象不可变条件。
对象创建后状态不会在更改,对象的所有域都是finalle
对象都是正确创建的(this引用没有逸出)

eg使用volatile发布不可变对象
class OneValueCache{
private final BigInteger lastNumber;
private final BigInteger[] lastFactors;
public OneValueCache(BigInteger i,BigInteger []factors){
lastNumber=i;
lastFactors=Array.copyOf(factors,factors.length);
}
public BigInteger[] getFactors(BigInteger i){
if(lastNumber==null|| !lastNumber.equals(i)){
return null;
}else
return Arrays.copyOf(lastFactors,lastFactors.length);
}

}
public class VolatileCachedFactorizer implements Servlet{
private volatile OneValueCache cache=new OneValueCache(null,null);
public void service(ServletRequest req,ServletResponse resp){
BigInteger i=extractFromRequest(req);
BigInteger[]factors=cache.getFactors(i);
if(factors==null){
factos=factors(i);
cache=new OneValueCache(i,factors);
}
encodeIntoResponse(resp,factors);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: