单例模式+生产者消费者问题+死锁
真正的多线程开发,降低耦合性
多线程就是一个独立的资源类,没有任何附属操作
属性和方法
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Synchronized和lock区别
-------------------------------------------------------------------------------------------------------------------------------------------------------
线程之间的通信问题:生产者和消费者问题。等待唤醒, 通知唤醒
线程交替执行 A B 操作同一个变量 num=0
流程:判断等待,业务,通知
八锁
锁的是对象或者是Class类模板;
普通方法锁的是调用者对象
static方法锁的是Class类模板
-------------------------------------------------------------------------------------------------------------------------------------------------------
多线程集合
Vector 底层Synchronize 提起synchronize就是效率低
CopyOnWriteArrayList 、CopyOnWriteArraySet 写入时复制 lock锁 复制出一个新数组,add数据,然后再把新数据复制给旧数组
ConcurrentHashMap 分段锁
创建线程三种方式:Thread继承类、Runnable接口、Callable接口(可以有返回值、可以抛出异常)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
CountDownLatch 减法计数器 测试四家OCR识别效果,开启四个线程去测试,完成一个线程-1,CountDownLatch达到0再唤醒主线程
CyclicBarrier 加法计数器
Semaphere 信号量 多个共享资源互斥的使用, 并发限流、控制最大线程数
semaphere.acqueire() 获得 加入已经满了,等待,等待释放为止
semaphere.release() 释放 会将信号量释放 +1,唤醒等待的线程
-------------------------------------------------------------------------------------------------------------------------------------------------------
ReadWriteLock 读写锁
读锁:共享锁 一次可以被多个线程共享
写锁:独占锁 一次只能被一个线程占有
读读:可以共享
读写:不可共享
写写:不可共享
-------------------------------------------------------------------------------------------------------------------------------------------------------
BlockingQueue 阻塞队列
场景:多线程并发处理,多线程池
-------------------------------------------------------------------------------------------------------------------------------------------------------
线程池(重点)
三大方法:
七大参数:
银行办理业务讲解线程池原理
四种拒绝策略:
- 中止策略:无特殊场景。
- 丢弃策略:无关紧要的任务(博客阅读量)。
- 弃老策略:发布消息。
- 调用者运行策略:不允许失败场景(对性能要求不高、并发量较小)。