多线程小结

  • 创建线程的方式
  • image.png | left | 719x83

    • thread,定义一个继承thread类
    • runnable实现runnable接口,无返回值
    • callable实现callable接口,有返回值
    • 线程池只能放入实现runnable或callable,不能直接放入继承thread类
  • 线程状态
    • 新建-就绪-运行-阻塞-死亡
    • run和start区别; 直接调用run,会当成普通方法
    • sleep和wait. sleep不会释放锁资源; wait会.
  • 线程同步

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

    • 自旋锁
      • 对象锁锁定状态只会持续很短一段时间,如整数自加,很短时间内阻塞并唤醒线程
    • 轻量级锁
      • 线程执行同步代码块前,jvm在当前线程栈帧中创建用于存储锁记录的空间,将对象头中的Mark Word复制到锁记录中;
    • 偏向锁
      • 多数情况不仅不存在多线程竞争,且总由同一个线程多次获得
      • 一个线程访问同步块并获取锁,会在对象头和栈帧中的锁记录存储锁偏向的线程ID;以后该线程进入,只需要测试对象图的mark word是否存储着指向当前线程偏向锁.
    • 重量级锁synchronized

image.png | left | 663x92

猜你喜欢

转载自blog.csdn.net/kwy15732621629/article/details/82531432