并发编程的艺术,让一不必二

     并发是个长久问题,很多时间里,我们喜欢说,应该是这样,可能是。但是,不够肯定,要肯定还得从书本上去肛答案。以下聊以藉慰。

      Syncronized 修饰方法时,同一个类中的所有syncronized 方法只能有一个方法被访问

      syncronized修复对象时,则只能影响到对象,不会阻止其他方法被访问

      在生产/消费场景中,由于需要对两个不同的方法进行同步,因此只能修饰方法,使其只能执行一个。

      jmm内存模型,as-if-serial, happens-before. 不管怎么样重排序,都不能影响结果。内存屏障,保证处理器不能重排序,编译器不能重排序。

      valatile是最轻量级的线程安全锁,它可以轻松保证一个变量的内存可见性。

      cas是性能最高的一种原子操作实现,但存在ABA问题,可以增加变量版本号来避免ABA问题。

      jmm内存模型,syncronized, volatile, final 内存语义。顺序一致性,重排序。

      单例模式的坑,new xxxObj(); 是非线程安全的,可以使用valatile或者内部类保证单例安全,final变量会在实例化或者使用该类之前完成初始化。final前后也产允许重振序。

      通过使用内存屏障保证重排顺序,StoreStore, StoreLoad, LoadLoad, LoadStore 屏障类型。

      wait阻塞是通过monitor enter exit 实现的。Thread.join()实现线程等待终止。

java中的锁

      Lock接口,可以使用多个锁,syncronized做不到。

      同步队列是一个fifo双向队列,head tail。锁一般都需要设置超时。

      ReentrantLock 重入锁,ReentrantReadWriteLock 读写锁,更高效读写。LockSupport工具,park阻塞。Condition接口,lock.newCondition();轻松实现多锁功能(空满两个锁配合)。

java并发容器和框架

      ConcurrentHashMap, doug lea, 分段锁高效。使用hash算法定位segment,再hash进行定位元素。

      阻塞队列,ArrayBlockingQueue, LinedBlockingQueue, PriorityBlockingQueue, DelayQueue, SyncronousQueue, LinkedTransferQueue, LinkedBlockingQueue.

      countDownLatch 制定要连接池总数,每使用一个,end countDL就countdown, 从而达到总数限制的作用。CyclicBarriar, 等到所有线程都到达屏障后,再一起做某件事,可以用来做真正的并发请求。

      Fork/Join框架。将大任务拆小,再汇聚结果。

原子类操作

      AtomicBoolean, AutomicInteger, Auto。

      AutomicLongArray, 

线程池的使用

      Threadpool。

       Executors。

posted @ 2018-06-29 07:16  阿牛20  阅读(483)  评论(0编辑  收藏  举报