这段时间,仔细学习了并发编程实践这本书,感觉非常不错。
学习到内置锁,lock,volatile,CAS等方面的知识。
syncronized内置锁与lock在使用选择上,性能只是一方面,主要lock提供了一些可中断,超时获取等一些特性,作为一个选择的依据。
volatile,提供了内存的可见性。同步同时提供同步块中操作的原子性与可见性。
现有底层cpu架构都支持CAS原语操作,java中封装好的类有AtomicInteger,AtomicLong,AtomicReference及AtomicStampedReference(提供版本号解决ABA问题)。
关于CAS及同步锁的选择上,当竞争非常激烈的情况下,由于多个线程CAS会有很多失败,而不断重试,这种情况下同步锁反而性能高。
CAS只有在竞争适中的情况下,会比同步锁性能高,这主要得益于线程同步锁时,发生的线程挂起及上下文切换。
AQS是一个JDK关于同步安全的一个基类,类似CountDownlatch,信号量Semaphor,Lock,FutrueTask的实现类ReentrantLock等都有用到AQS。
其实,应用中安全发布问题,之前项目中一般都用类初始化发布资源,从书中学到了延迟类初始化来发布资源。代码如下:
class ResourceFactory{
private class ResourceHolder{
public static Resource resource=new Resource();
}
public Resource getResource(){
return ResourceHlder.resource;
}
}
这段代码提供了安全的延迟初始化resource。在调用ResourceFactory的getResource方法时,将触发ResouceHolder中resource的初始化,JVM会确保当多个线程对resource初始化时的安全性。
技术需要沉淀!