并发编程的艺术,让一不必二
并发是个长久问题,很多时间里,我们喜欢说,应该是这样,可能是。但是,不够肯定,要肯定还得从书本上去肛答案。以下聊以藉慰。
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。