并发是个长久问题,不少时间里,咱们喜欢说,应该是这样,多是。可是,不够确定,要确定还得从书本上去肛答案。如下聊以藉慰。java
Syncronized 修饰方法时,同一个类中的全部syncronized 方法只能有一个方法被访问算法
syncronized修复对象时,则只能影响到对象,不会阻止其余方法被访问安全
在生产/消费场景中,因为须要对两个不一样的方法进行同步,所以只能修饰方法,使其只能执行一个。并发
jmm内存模型,as-if-serial, happens-before. 无论怎么样重排序,都不能影响结果。内存屏障,保证处理器不能重排序,编译器不能重排序。app
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。