1,多线程的使用,实现runnable或继承Thread类或者实例化Thread类传入匿名实现Runnable接口的类对象,MultiplyThread类避免锁竞争
2,脏读的概念以及synchronized关键字用法和锁的概念
3,对象锁以及wait和notify用法以及CountDownLanch
4,ConcurrentHashMap的segment概念以及CopyOnWrite类使容器类具有并发性的读写分离概念,CopyOnWriteArrayList.CopyOnWirteArraySet
5,并发Queue,ConcurrentLinkedQMasterueue,采用读写分离实现
6,future模式,用于异步请求,并行存储,包装类收到请求,返回假对象,再偷偷请求真实数据,再返回。获取数据时如果没装载好就使程序阻塞。jdk中封装有future类
7,Master-Worker模式是一种常见的并行计算模式。核心思想是两类进程协助工作,Master负责接收和分配任务,Worker负责处理子任务。Worker各个子线程工作完后将结果返回给Master,Master负责归纳和总结。
8,生产者-消费者模式,消息中间件实现消息堆积
9,线程池的概念,ExecutorService,Executor框架,
newFixedThreadPool(),返回固定数量的线程池,
newSingleThreadExecutor(),创建一个线程的线程池,
newCachedThreadPool()返回一个可根据实际情况调整线程个数的线程池
newScheduleadThreadPool,该方法返回一个ExecutorService对象,但该线程可以指定线程的数量
new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,Timeunit unit(时间单位), workQueue,ThreadFactory,ejectedExecutionHandler)
ejectedExecutionHandler jdk拒绝策略
AbortPolicy 抛异常
CallerRunsPolicy 在调用者线程中运行当前被抛弃的任务
DiscardOldestPolicy 丢弃最老的请求
DiscardPolicy 丢弃无法处理的任务
自定义拒绝策略可以实现RejectedExecutionHandler接口
9.Concurrent.util常用类
CyclicBarrier使用. 子线程调用barrier.await 实例化 CyclicBarrier barrier = new CyclicBarrier(3;
当有三个线程调用await方法后三个线程就会同时开始执行
CountDownLacth(count)用于监听某些初始化操作,初始化后通知主线程继续工作,
使子线程按照一定count由小至大循序执行
Calable和Future的使用
Calable
Future适合在执行耗时很长的操作时使用,提高系统吞吐量
FutureTask<String> futureTask = new FutureTask<String>(new FutureHandle("Liuao"));//传入实现了Calable接口的类
ExecutorService excutor = Executors.newFixedThreadPool(2);创建执行线程池
Future f = excutor.submit(futureTask);在子线程中处理逻辑,主线程继续往下,从而减少等待时间
System.out.println(futureTask.get());拿到返回结果,如果没有就会阻塞等待子线程执行完毕直到拿到返回值
Semaphore(信号量)限流使用
Semaphore semaphore = new Semaphore(5);
semaphore.acquire();//请求许可
semaphore.release();//释放许可
10,锁
ReentrantLock(重入锁)
ReentrantLock lock = new ReentrantLock();
lock.lock();
lock.unlock();
Lock类 Lock lock = new ReentrantLock();
Condition c = lock.newCondition();获得Condition对象,可通过一个Lock对象产生多个condition进行线程间的交互,可操作部分线程唤醒,condition.singalAll();
公平锁与非公平锁Lock lock = new ReentrantLock(false);默认false非公平
公平则是先调用则先上锁,非公平则是cpu决定,非公平锁性能优于公平锁
Disrupter框架
BlockingWaitStrategy 是最低效的策略,但其对cpu的消耗最小并且在各种环境中提供更加一致的表现
SleepingWaitStrategy 的性能与BlockingWaitStrategy差不多,cpu消耗也差不多,但对生产者线程影响最小,适合异步日志类
YieldingWaitStrategy的性能是最好的,适合于低延迟的系统,在要求极高性能且事件处理线小于cpu逻辑核心数的场景中,使用此策略,例如cpu开启超线程特性(推荐使用)
Disruptor d =new Disruptor<Event(自定义的一个bean)>(EventFactory factory,ringBufferSize,executor,ProducerType,
YiedingWaitStrategy);
d.handlerEventsWith(EventHandler e); //传入一个实现了EventHandler接口的对象,在该对象重写该接口的方法中写处理逻辑
d.start();//启动disruptor
RingBuffer ringBuffer = disruptor.getRingBuffer();
LongEventProducer producer = new LongEventProducer(ringBuffer);
EventProducer类具体实现