整理一下《java并发编程实战》中的知识点
- 分工、同步、互斥的历史由来
分工:单道、多道、分时
同步:线程通信(组织编排任务)
互斥:因(多线程访问共享资源)果(串行化共享资源的访问)
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并发编程实战》中的知识点的更多相关文章
- 【java并发编程实战】-----线程基本概念
学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...
- Java并发编程实战——读后感
未完待续. 阅读帮助 本文运用<如何阅读一本书>的学习方法进行学习. P15 表示对于书的第15页. Java并发编程实战简称为并发书或者该书之类的. 熟能生巧,不断地去理解,就像欣赏一部 ...
- 【Java并发编程实战】----- AQS(四):CLH同步队列
在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
- 【Java并发编程实战】----- AQS(二):获取锁、释放锁
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...
- 【Java并发编程实战】-----“J.U.C”:CountDownlatch
上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...
- 【Java并发编程实战】-----“J.U.C”:CyclicBarrier
在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock
ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...
- 【Java并发编程实战】-----“J.U.C”:Semaphore
信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个"共享锁". Java并发提供了两种加锁模式:共享锁和独占锁.前面LZ介绍的ReentrantLock就是 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantLock之三unlock方法分析
前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获 ...
随机推荐
- MySQL全面瓦解6:查询的基本操作
概述 提到查询,就回到我们第四篇的SQL语言分类了,DQL(Data QueryLanguage),也就是数据查询语言,实际就是从数据库中获取数据的一种命令方式.我们给数据库发送一个查询语句的命令,数 ...
- react中iconfont字体图标不显示问题
如下图, 写四个圆圈,直接将iconfont的字体编码写在静态HTML结构中时显示没问题,然而明显这样的结构用循环写是更好的选择, 但是,页面上不能显示字体图片了,而是直接显示字体编码 原因是字体编码 ...
- 面试 之 nginx,负载,动静分离
大家先看这个逻辑图 为什么我们要这样去架构我们的一个项目呢? 这样做的话,动态请求要先访问 A,A 转发访问 B,再由 B 返回结果给 A,A 最后又将结果返回给客户端这样是不是很麻烦? 最初开发的时 ...
- python动态规划
动态规划: 动态规划表面上很难,其实存在很简单的套路:当求解的问题满足以下两个条件时, 就应该使用动态规划: 主问题的答案 包含了 可分解的子问题答案 (也就是说,问题可以被递归的思想求 ...
- 基于C++语言实现机动车违章处罚管理系统
这篇文章主要介绍了基于C++语言实现机动车违章处罚管理系统的相关资料,需要的朋友可以参考下 关键代码如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...
- 《.NET 5.0 背锅案》第3集-剧情反转:EnyimMemcachedCore 无罪,.NET 5.0 继续背锅
今天晚上基于第2集中改进版的 EnyimMemcachedCore 进行了发布,发布过程中故障重现,最大的嫌犯 EnyimMemcachedCore 被证明无罪,暂时委屈 .NET 5.0 继续背锅. ...
- C++如何实现多态
1. 什么是多态多态是C++中的一个重要的基础,面向对象编程语言中,接口的多种不同的实现方式即为多态.2. 多态带来的好处多态带来两个明显的好处:一是不用记大量的函数名了,二是它会依据调用时的 ...
- 在Linux中输入命令时打错并按了enter
今天在Linux中输入命令时,打错一个单词了,之后出现一串串的~,按ESC也没用, 并在底部出现:quit<enter> to exit vim 解决办法: 按几下 esc 确保 vim ...
- kali 系列学习12-使用Wifite破解无线网络
一些破解无线网络程序是使用Aircrack-ng工具集,并添加了一个图形界面或使用文本菜单的形式来破解无线网络.这使得用户使用它们更容易,而且不需要记住任何命令.本节将介绍使用命令行工具Wifite, ...
- 这几种实现线程的方法你一定要知道,月薪20k以上的面试都会问到
实现线程的三种方式总结 最近有看到Java线程的实现相关问题,在此对线程实现方式做一个小小的总结,当做笔记,便于日后查看. 平时常用的线程方式有三种: (1).继承Thread类,并重写其run()方 ...