- 创建线程的方式
-
- thread,定义一个继承thread类
- runnable实现runnable接口,无返回值
- callable实现callable接口,有返回值
- 线程池只能放入实现runnable或callable,不能直接放入继承thread类
- 线程状态
- 新建-就绪-运行-阻塞-死亡
- run和start区别; 直接调用run,会当成普通方法
- sleep和wait. sleep不会释放锁资源; wait会.
- 线程同步
- 锁
- synchronized
- 修饰实例方法,当前实例加锁,进入同步代码块要获得当前实例的锁
- 静态方法,当前类对象加锁,进入同步代码块需要获得当前类对象的锁
- 代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁
- ReentrantLock
- 完全互斥排它锁
- synchronized
- volatile
- 保证可见性/禁止指令重排序
- 执行到内存屏障这句指令,前面的操作已经全部完成; 强制对缓存的修改操作立即写入主存;写操作,导致其他CPU对应缓存行无效;
- ThreadLocal
- 每个线程创建自己独立副本
- 锁
- 线程通信
- 保证线程按顺序执行: Thread.join()
- wait()让一个线程在某个条件下暂停运行; notify()仅仅通知一个 notifyAll()通知所有;
- Lock的Condition; 选择性通知
- 线程安全集合类
- arraylist不是线程安全的,替代方式(适合大量随机访问情况下使用)
- vector(里面有synchronized关键字)
- 使用synchronized关键字;
- 使用Collections.synchronizedList()
- 如果要把一个hashmap转成一个线程安全的.
- 使用concurrentHashMap
- 使用hashtable(整个表上锁实现线程安全, 效率比较低)
- 使用Collections类的synchronizedMap包装一下
- CopyOnWrite开头集合
- arraylist不是线程安全的,替代方式(适合大量随机访问情况下使用)
- 线程池
- ThreadPoolExecutor
- FixedThreadPool: 固定数量,控制线程最大并发数 –无界队列
- SingleThreadPool: 单个线程,保证顺序执行各个任务,且在任意时间点,不会有多个线程 –无界队列
- CachedThreadPool: 大小无界, 短期异步执行小程序 —无容量SynchronousQueue. 因创建过多线程耗尽CPU和内存
- SchduledThreadPoolExecutor
- ScheduThreadPoolExecutor:定长线程池,支持定时及周期性任务执行
- SingleThreadScheduledExecutor 单个后台线程执行,保证顺序执行各个任务
应用场景
- 核心参数
- corePoolSize:核心线程池大小
- maximumPool:最大线程池大小
- runnableTaskQueue: 任务队列
- ArrayBlockingQueue: 基于数组结构的有界阻塞队列;
- LinkedBlockingQueue:基于链表结构的阻塞队列
- SynchronousQueue: 一个不存储元素的阻塞队列
- ThreadFactory:设置创建线程的工厂
- RejectedExecutionHandler:饱和策略
- keepAliveTime: 线程活动保持时间
- 什么情况下创建新的线程
- Fixed/Single:当前运行任务线程池数少于corePoolSize,创建新线程来执行任务
- cache初始maximumPool为空,或者其无空闲线程,创建新线程:
- ThreadPoolExecutor
- Fork/Join
- 一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果
- Future
- FutureTask:一个线程需要等待另一个线程把某个任务执行完后才能继续执行
- CountDownLatch
- 允许一个或多个线程等待其他线程完成操作,比join功能更多
- CyclicBarrier
- 直到最后一个线程到达屏障,屏障才会开门,所有被屏障拦截的线程才会继续运行
- 与countdownLatch区别:countDownLatch计数器只能使用一次;cyclicBarrier可以处理更为复杂的业务场景
- Semaphore
- 控制并发线程数; 用于流量控制
- Exchanger
- 线程间交换数据
- 遗传算法
- 校对工作
- 锁
- 自旋锁
- 对象锁锁定状态只会持续很短一段时间,如整数自加,很短时间内阻塞并唤醒线程
- 轻量级锁
- 线程执行同步代码块前,jvm在当前线程栈帧中创建用于存储锁记录的空间,将对象头中的Mark Word复制到锁记录中;
- 偏向锁
- 多数情况不仅不存在多线程竞争,且总由同一个线程多次获得
- 一个线程访问同步块并获取锁,会在对象头和栈帧中的锁记录存储锁偏向的线程ID;以后该线程进入,只需要测试对象图的mark word是否存储着指向当前线程偏向锁.
- 重量级锁synchronized
- 自旋锁
多线程小结
猜你喜欢
转载自blog.csdn.net/kwy15732621629/article/details/82531432
今日推荐
周排行