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

整理一下《java并发编程实战》中的知识点的更多相关文章

  1. 【java并发编程实战】-----线程基本概念

    学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...

  2. Java并发编程实战——读后感

    未完待续. 阅读帮助 本文运用<如何阅读一本书>的学习方法进行学习. P15 表示对于书的第15页. Java并发编程实战简称为并发书或者该书之类的. 熟能生巧,不断地去理解,就像欣赏一部 ...

  3. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  4. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  5. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

  6. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...

  7. 【Java并发编程实战】-----“J.U.C”:CyclicBarrier

    在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...

  8. 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock

    ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...

  9. 【Java并发编程实战】-----“J.U.C”:Semaphore

    信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个"共享锁". Java并发提供了两种加锁模式:共享锁和独占锁.前面LZ介绍的ReentrantLock就是 ...

  10. 【Java并发编程实战】-----“J.U.C”:ReentrantLock之三unlock方法分析

    前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获 ...

随机推荐

  1. 关于C语言中的位运算符的学习即应用

    一.运算符的种类和运算规则: &      与:全1则1,有0则0   |       或:有1则1,全0则0   ^   异或:相同为0,不同为1   ~   取反:~是一元运算符,用来对一 ...

  2. FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放

    前言   ffmpeg播放rtsp网络流和摄像头流.   Demo   使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克     使用ffmpeg播放网络rtsp文件流 ...

  3. project--客户信息管理系统

    软件设计分析 该软件有三个模块组成:Customer  CustomerList  CustomerView Customer 为实体对象,用来封装客户信息: CustomerList 为 Custo ...

  4. mybatis 字符串比较 == 用法

    private String deptLevel; <when test='deptLevel=="3"'> 正确 <when test="deptLe ...

  5. Jave正则的实现

    java的正则实现需要先导入 java.util.regex. java.util.regex 包主要包括以下三个类: Pattern 类: pattern 对象是一个正则表达式的编译表示.Patte ...

  6. 04 . Vue组件注册,数据交互,调试工具及组件插槽介绍及使用

    vue组件 组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的 ...

  7. Ceph的Mon数据重新构建工具

    关于mon的数据的问题,一般正常情况下都是配置的3个mon的,但是还是有人会担心 Mon 万一三个同时都挂掉了怎么办,那么集群所有的数据是不是都丢了,关于后台真实数据恢复,有去后台取对象,然后一个个拼 ...

  8. Javaer 进阶必看的 RocketMQ ,就这篇了

    每个时代,都不会亏待会学习的人. 大家好,我是 yes. 继上一篇 头条终面:写个消息中间件 ,我提到实现消息中间件的一些关键点,今天就和大家一起深入生产级别消息中间件 - RocketMQ 的内核实 ...

  9. phpmyadmin 4.8.1任意文件包含(CVE-2018-12613)

    简介 环境复现:https://gitee.com/xiaohua1998/hctf_2018_warmup 考察知识点:文件包含漏洞(phpmyadmin 4.8.1任意文件包含) 线上平台:榆林学 ...

  10. Nmap详解

    扫描方式 -Pn/-P0:扫描前不用ping测试目标是否可达,默认所有目标端口都可达 -sT:TCP Connect扫描,进行完整的TCP三次握手,该类型扫描已被检测,且会在目标日志中记录大量连接请求 ...