`
BradyZhu
  • 浏览: 248402 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【总结】Java多线程

阅读更多
  • Java内存模型
    • 工作内存主内存
      • 主内存
        • Java内存模型所有的变量都存储在主内存
      • 工作内存
        • 每个线程有自己独立的工作内存,它保存了该线程使用的变量的主内存拷贝
        • 线程对变量的操作都在自己的工作内存中进行不能直接操作主内存其他工作内存的存储变量或变量副本
      • 线程间的变量访问通过主内存来完成
    • Java内存交互协议
      • lock:主内存变量,把一个变量标识为某个线程的独占状态
      • unlock:主内存变量,把一个处于锁定状态变量释放出来
      • read:主内存变量,把变量值从主内存传输到工作内存
      • load:工作内存变量,读取内存中的变量值放入工作内存中
      • use:工作内存变量,把工作内存中变量中的只传递给Java虚拟机执行引擎
      • assign:工作内存变量,把执行引擎收到变量的值赋值给工作变量
      • store:工作内存变量,把工作内存中的一个变量的值传达到主内存中
      • write:主内存变量,把store操作从工作内存中得到的变量值放入主内存的变量中
  • synchronized
  • volatile
    • 修饰变量
    • 轻量级synchronized
    • 线程可见性
    • 不适合++,--操作的变量更新操作的情况
    • 直接存储在主内存,减少线程上下文的切换和调度
  • CAS指令
  • JDK并发包
    • 原子量
      • 无锁算法,使用底层原子化的机器指令
      • 比较并交换(CAS)
      • java.util.concurrent.atomic包含了原子变量类
        • AtomicInteger
        • AtomicLong
        • AtomicReference
        • AtomicBoolean
    • 并发集合
      • ConcurrentHashMap
      • ConcurrentLinkedQueue
      • 队列Queue和BlockingQueue
        • ArrayBlockingQueue:由数组支持的有界队列
        • LinkedBlockingQueue:由连接节点支持的可选有界队列
        • PriorityBlockingQueue:由优先级堆支持的无界优先级队列
        • DelayQueue:由优先级堆支持的,基于时间的调度队列
        • SynchronousQueue:利用BlockingQueue接口的鸡蛋聚集(redezvous)机制,不存储元素的阻塞队列
        • LinkedTransferQueue:由链表结构组成的无界阻塞队列
        • LinkedBlockingDeque:由链表结构组成的双向阻塞队列
    • 线程池
      • 线程池好处
        • 通过重复利用已创建的线程减低线程创建销毁造成的消耗
        • 提高响应速度,任务到达时,任务不需要等待线程创建而直接执行
        • 提高线程的可管理性
          • 线程是稀缺资源,不能无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性
          • 使用线程池可以统一分配,调优和监控线程
      • 线程池创建:ThreadPoolExecutor类
        • corePoolSize
        • maximumPoolSize
          • core size不到的时候,创建新线程
          • core size到了,任务被放入队列
          • core size到了,并且队列满了,创建新线程直到max size
          • 如果队列满了,max size也达到了,那就开始拒绝任务了
        • keepAliveTime
          • 表示线程没有任务执行时最多保持多久时间会终止
          • 默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize,即当线程池中的线程数大于corePoolSize时,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize
          • 如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0
        • timeUnit
        • workQueue
        • threadFactory
        • rejectedExecutionHandler
      • 线程池的饱和策略
        • AbortPolicy:直接抛出异常
        • CallerRunsPolicy:只用调用者所在线程来运行任务
        • DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务
        • DiscardPolicy:不处理,丢弃掉
      • 向线程池提交任务
        • execute:无还回值,传递Runnable实例
        • submit:还回Future对象,传递Runnable或Callable实例
      • 线程池的关闭
        • showdown和showdownNow:遍历池中所有的线程,调用interrupt来中断线程
      • 线程池的分析
      • 合理的配置线程池
        • 任务性质
          • CPU密集型:尽可能小的线程
          • IO密集型:尽可能 多的线程
          • 混合型任务:根据CPU和IO密集型类型进行拆分
        • 任务优先级:高中低
        • 任务执行时间:长中短
        • 任务的依赖性:是否依赖其他系统字眼,如数据库连接
      • 线程池的监控
        • taskCount
        • completedTaskCount
        • largestPoolSize
        • getPoolSize
        • getActiveCount
    • CopyOnWriteArrayList和CopyOnWriteArraySet:
      • 为了维护对象的一致性快照,依靠不可变性(immutability)来消除在协调读取不同的但是相关的属性时需要的同步
      • 适合读操作远大于写操作的情况
    • 同步器
      • Semaphore
        • 提供了一个计数信号量,维护了一个许可集
        • acquire()阻塞获取许可
        • release()添加一个许可
        • 用于限制可以访问某些资源的线程数目(OS调度使用PV原语P:acquire,V:release)
      • CyclicBarrier
        • 允许一组线程互相等待,直到达到某个公共屏障点
        • 通过await()方法等带其他线程
      • CountDownLatch
        • 在完成一组正在其他线程中执行操作之前,允许一个或多个线程一直等待
        • 一个线程调用await()方法后,在当前计数到达0之前,会一直阻塞
        • 其他线程调用countDown()会使计数器递减,计数器值为0时会释放所有等待的线程
      • Exchanger
        • 一对线程可以交换数据
        • 通过exchange()方法的入口提供数据给他的伙伴线程
    • 显示锁
      • Lock
        • 提供无条件的,可轮询的,定时的,可中断的锁获取操作
        • 所有的枷锁和解锁都是显示的
        • 提供更灵活的枷锁机制,弥补了内部锁在功能上的局限:不能中断哪些正在等待获取锁的线程,并且在请求锁失败的情况下,必须无线等待
      • Condition
        • Lock替代了synchronized,Condition替代了Object监视器方法的使用
        • await类似Object的wait,signal类似Object的notify
      • ReentrantLock
        • 实现可轮询的锁请求:tryLock()方法
        • 实现可定时的锁请求:tryLock(timeUnit)
        • 实现可中断的锁获取请求:lockInterruptibly()能够使你获得锁的时候响应中断
      • ReadWriteLock
        • 一般用于缓存设计
        • 维护了一对相关的锁,一个用于读操作,一个用于写操作
        • 只要没有writer,读取锁可以由多个reader线程同事保持。写入锁是独占的
      • ReentrantLock锁和Java内在锁的区别
        • ReentrantLock必须在finally中释放锁,而synchronized会自动释放
        • ReentrantLock更具伸缩性
        • 对于ReentrantLock,可以不止一个条件变量与之关联
        • 允许选择想要一个公平锁,还是一个不公平锁
        • synchronized在需要明确的需要下使用,更简单
    • Fork-Join框架
      • 步骤
        • 分割任务
        • 执行任务并合并结果
        • ForkJoinTask
          • RecursiveAction:没有还回结果的任务
          • RecursiveTask:有还回结果的任务
        • ForkJoinPool:ForkJoinTask需要通过ForkJoinPool来执行






















分享到:
评论

相关推荐

    Java多线程知识点总结

    该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!

    Java多线程编程总结

    Java多线程编程总结Java多线程编程总结Java多线程编程总结Java多线程编程总结Java多线程编程总结Java多线程编程总结

    java多线程编程总结

    详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...

    java多线程总结(一)

    java多线程总结

    Java多线程的总结

    Java多线程的重要性可想而知,而对于多线程,某些情况下,又比较难理解,稍微参照网上的资料进行了总结

    java多线程核心技术

    资深Java专家10年经验总结,全程案例式讲解,首本全面介绍Java多线程编程技术的专著 结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践 Java多线程无处不在,如...

    我总结的Java多线程程序设计

    这是我总结的Java多线程资料 很全 很经典

    java多线程全面总结

    java多线程全面总结,简单的介绍多线程技术中的各种应用问题,是你对多线程有更多的认识!

    JAVA多线程(精典总结)

    JAVA多线程(精典总结) 面试 大全 java

    java多线程编程大总结

    java多线程编程大总结:Java 线程是 Java 语言中一个非常重要的部分,Java5 之前,多线程的语言支持还是比较弱的, 内容也较少,写一个复杂的多线程程序是相当有挑战性的。 在Java5 以后,Java 对多线程做了很多...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    Java 高并发编程相关知识, 接下来将阅读该书, 并且进行比较详细的总结, 好记性不如烂笔头, 加油。 Java 多线程编程实战指南。

    40个Java多线程问题总结

    40个Java多线程问题总结 遇到问题讲解 解决方案

    JAVA多线程总结

    JAVA多线程总结

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

    Java中的多线程学习总结

    Java中的多线程学习总结Java中的多线程学习总结

    corejava多线程学习总结.pdf

    corejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习...

    《Java多线程设计模式》附源码中文教程 (PDF)

    多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中在代码的重要部分加上标注使读者更加容易...

Global site tag (gtag.js) - Google Analytics