• 整理一下《java并发编程实战》中的知识点


    1. 分工、同步、互斥的历史由来

        分工:单道、多道、分时

        同步:线程通信(组织编排任务)

        互斥:因(多线程访问共享资源)果(串行化共享资源的访问)

        1切都是为了提高性能

      2.可见性、原子性、有序性

        可见性:CPU缓存导致可见性问题

        原子性:线程切换导致原子性问题

        有序性:编译优化带来的有序性问题

      3.java创建对象的过程

    • 分配内存M
    • 将M地址分配给变量
    • 在内存M上初始化对象

      4.java内存模型

    • volatile
    • synchronized
    • final(生而不变)
    • happen-before原则
      • 顺序性:在同一个线程中,按程序顺序,前面的操作对后续操作可见
      • 可见性:对一个volatile变量的写操作对后续volatile变量的读操作可见
      • 传递性:A -> B 可见,B -> C 可见,A -> C 就可见
      • 对一个锁对象的解锁对后续对这个锁对象的加锁可见(加锁本质就是在锁对象的对象头中写入当前线程id)
      • 线程A启动子线程B后,子线程B能感知到主线程在启动子线程B之前的操作
      • 主线程A等待子线程B操作完成(B.join()方法返回)后,主线程能看到子线程B的操作

      5.对象逸出(不好的操作)

        将对象引用赋值给全局变量

      6.互斥锁

        同一时刻只有一个线程执行,称为互斥

        java提供的互斥锁实现:synchronized,其加锁lock()[monitorenter]和解锁unlock()[monitorexit]均由jvm执行

          

          

       7.如何用一把锁保护多个资源?

    • 资源间没有关系:可用synchronized,但性能差,串行化执行
      •   可替换为细粒度锁,但需注意死锁
    • 资源间有关系:可用类对象锁,性能差
      •   可增加委托人,委托人可同时持有关联资源各自的锁(细粒度锁,可能导致死锁),委托人需单例

       8.死锁

        形成条件

    • 互斥
    • 占有且等待
    • 不可抢占
    • 循环等待

        破坏方案

    • 无法破坏
    • 增加委托人(单例)
    • synchronized无法做到主动释放已占有的资源,因其机制如此,但JUC中有机制可以解决
    • 对资源排序

      8.原子性问题本质

        保证中间状态对外不可见

      9.可变对象不能作为锁

      10.等待通知机制

        线程获取互斥锁, 进入临界区执行代码

    • if(临界区条件不满足)  释放互斥锁,进入等待状态  //如果在临界区if之前修改了成员变量,在线程进入等待状态后,该成员变量的值是否会被保存?
    • if(临界区条件满足)  通知等待的线程,去获取互斥锁

      11.安全性问题:

        多个线程同时读写同一数据

      12.数据竞争与竞态条件

        数据竞争:多个线程不加锁读写同一数据

        竞态条件:程序的执行结果依赖线程执行的顺序

        这两类问题都可以使用互斥这中方案,包括CPU指令,操作系统、编程语言提供的API

        从逻辑上看,都可以归类为

      13.活跃性问题

    • 活锁:线程没阻塞(互相谦让),但无法继续执行
      • 尝试随机等待时间
    • 饥饿:线程因无法访问所需资源而无法继续执行的情况
      • 保证资源充足
      • 公平分配资源 ==> 公平锁(先来后到)
      • 避免持有锁的线程长时间执行

      14.性能问题

        JUC包提供很多工具,一部分原因是为了提升某个特定领域的性能

      解决方案

    • 无锁工具
      • Thread Local Storage
      • Copy On Write
      • 乐观锁
      • 原子类
      • Disruptor无锁队列
    • 减少锁持有时间
      • 细粒度锁
      • 分段锁(ConcurrentHashmap)
      • 读写锁(读没有锁,写有)

    部分摘自:https://time.geekbang.org/column/article/84344

  • 相关阅读:
    FILE 创建
    jfreechart折线图 demo
    Win7下Maven的安装与配置
    IntelliJ IDEA 14.x 与 Tomcat 集成,创建并运行Java Web项目
    Java中print、printf、println
    添加SSH密钥到GitHub
    GitHub学习资料
    Windows下Git的安装及配置
    【转】我害怕阅读的人
    安装MongoDB
  • 原文地址:https://www.cnblogs.com/woooodlin/p/13227127.html
Copyright © 2020-2023  润新知