《java 并发编程实战》

说真的这是一部好书,一本彻彻底底了解java并发编程的好书。为啥我这么说呢???虽然我看了书一半。

  首先,这本书讲了很多不知道的知识,关于java线程的底层知识,锁的原理。先介绍了线程安全的基础知识,包括什么是原子性,内置锁的作用。还有支持重入锁,然后介绍共享对象,以及发布一个对象会逸出,其实不是自己本来希望,对于引用型变量尤其要注意。最好是线程封闭,也介绍了实现封闭的几种方式,最常用的话应该是threadlocal类,其他几个我也看不懂。。还有开发比较常用的就是利用final,修饰线程,数据等。避免线程读不一致。

接着,这本书介绍了发布对象的安全问题,还有如何设计安全的类,偏理论。讲的都是一些设计模式,阻塞队列模式也是很重要,有兴趣可以看看

我目前看到最关键的地方,也是让我拍手称快的地方就是,关于线程池,Executuor的使用,创建缓存,固定数量,单例,定时。的线程池,最让我感到牛逼的地方就是future的使用,对于性能改善,特别适用于多线程,通常也要配合callable使用。

还有线程几种模式,有future,定时,中断,栅栏,闭锁等,这个蛮重要的

这个星期我把它看完了,如果你看到这里一定会觉得很失望,我基本没讲什么干货。没错,我这更倾向于读后感,这本书确实很不错。看的时候我觉得他很晦涩,很想看完它。但是看完了之后,我又是觉得有点失落,为啥这么好的书就被看完了。下面我还是搞点干货吧,证明我也是好好读过这本书。我想讲的是CAS,非阻塞同步机制。

第一部分,锁的劣势

1、挂起和恢复线程过程中存在很大的开销,和线程中断。特别是多个线程同步竞争锁的时候

2、使用volatile确实不会上下文切换,但是并不能保证操作的原子性,只能保证如果操作成功,其他线程读取值是一致的

3、线程优先级没法控制。优先级高的线程可能因为获取不到锁而陷入饥饿状态。并且在等待锁的过程中也无法做其他的事情。

 CAS的原理

1、对细粒度的操作使用更加高效的方法。也是基于冲突检查机制来判断是否来自其他线程的干扰(说白了就是,如果有某一个线程修改成功了值,那么这个操作就会失败,并且返回。如果自己修改失败,也会返回。如果可以修改成功,就修改利用的是早期处理器自带的原子操作方法,比如Compare-and-swap) java从5.0之前不可以使用这些方法

2、CAS包含了三个操作数 :需要读写的位置V,比较的值A 和拟写入的新值B 当获取V的指为A CAS才会根据需要修改A的值为B。否则不会执行操作,不过V的值是否等于A都会返回V处的值 下面是模拟CAS操作

public class SimulateCAS{

    private int value;

    public synchronized int get(){return value;}

    public synchronized int compareAndSwap(int expectedValue, int newValue){

         int oldValue = value;

      if(oldValue == expectedValue)
           value = newValue; 

     public synchronized boolean compareAndSet(int expectedValue, int newValue){

return (expectedValue == compareAndSwap(expectedValue,newValue);

}

结论: CAS操作比一般的锁操作更加简单,用它就对了

我在以非阻塞链表为例,介绍下CAS算法思想 主要的是利用compareAndSet这个方法。

以及next指针是否为空来判断是否是正在执行更新操作。

}

猜你喜欢

转载自blog.csdn.net/qq_35866365/article/details/81517638