Java并发

本文回顾并发知识,划出关键部分,


并发基础

“共享”、“可变“、“可重入”, 线程之间对象“可见性”是并发的基础。

valotile 修饰的对象可以在线程之间通知更新,但是无法做到原子性。如果状态变更依赖之前的状态值,那么就会出现脏读。

ThreadLocal修饰的对象在每个线程中有一个副本,在单线程移植到多线程时可以有,也可以用来实现线程封闭,但是不能滥用到每一个成员对象。

编写高效并发时注意策略:

   线程封闭-可由threadlocal实现

   只读共享- 设置为final 不可变对象

   线程共享安全 -- 采用合适的设计模式提供统一的公有接口,屏蔽线程安全,如果HashTable,concurrenMap;HashSet,CopyOnWriteArrayList;blockQueue、concurrentLinkedQueue

 保护对象: 加锁机制synchronize、Lock

迭代优先的同步类

CopyAndWriteArrayList/CopyAndWriteSet

双向队列主要用来解决既是生产者又是消费者,线程充分利用的情况,主要是

Deque和BlockingDeque


基础构建模块

线程同步的方法

信号量(semophone)、栅栏(cycleBarrier)、闭锁(Latch)、phaser

countdownlatch可以控制多线程同时启动、结束。 latch.await() -> latch.countdown().

信号量类似于lock,多任务的lock

栅栏 两阶段控制,可reset

phaser多阶段控制,可加入、中断单个任务。



线程池

Executor 

excutorService extends Executor 

   newFixedThreadPool, 

  newCachedThreadPool, 

  newScheduledThreadPool,

  newSingleThreadPool

ThreadPoolExecutor extends AbstractExecutorService


ThreadPoolExecutor(int corePoolSize, 

 int maximumPoolSize, 

 long keepAliveTime, 

 TimeUnit unit, 

 BlockingQueue workQueue,   线程阻塞队列

    RejectedExecutionHandler handler)  队列饱和时处理句柄

线程池中通过设置标志位来处理中断。


显示锁

Lock/ReentrantLok

相比于隐式锁,lock更加另外,也容易产生死锁。


同步框架基类

abstractQueueSynchronizer

基于状态、FIFO队列,action组成各类同步控制子类。



原子处理

原子处理基于硬件基础

java内存模型JMM

编译器在编译的时候为了保证虚拟机执行这正常,会进行“重排序”

并发标注

为了协同性更好,也可以说为了别给他人外坑,必要的文档说明是合理的。

jdk1.8_101 并发包


jdk1.8_101原子类



例子

hibernate sessionFactory并发访问

背景:

OSGI容器,组件的加载分:installed、actived,数据库抽象层全部依赖hibernate

多个bundle会并发访问

附录

并发最根本的还是要理解好"共享"、“可变”、“可见性”,“可重入”,熟悉jdk提供的每一个api的背景和解决的问题点。学习AQS有助于理解各同步类的使用方法。

软件最终是通过c\c++操纵硬件,硬件的原子性性能是最佳的,所以尽可能用原子操作。

你可能感兴趣的:(Java并发)