java并发知识点
前言
先列出java并发涉及的知识点,后面再慢慢补.
java并发
1 常见概念
进程/线程
- 进程:程序执行的实体,操作系统资源调度资源分配的基本单元
- 线程:程序执行的最小单元,拥有独立的堆栈和局部变量等属性,可以共享进程的资源
同步(Synchronous)/异步(Asynchronous)
- 同步是串行执行,阻塞
- 异步是并行执行,非阻塞
并发/并行
- 并发:多个任务交替执行
- 并行:多个任务同时执行
临界区
阻塞(Blocking)/非阻塞(Non-Blocking)
死锁/饥饿/活锁
JMM(java内存模型)
- 可见性
- 原子性
- 有序性
并发级别
- 阻塞(加锁阻塞)
- 无饥饿(公平锁实现无饥饿)
- 无锁(CAS)
- 无等待(Read-Copy-Update)
2 多线程基础
线程状态
- New:新建
- Runnable:运行中
- Blocked:阻塞, 等待锁是blocked
- Waiting:等待,Object.wait/Condition.await操作释放锁,线程进入等待状态
- Time-Waiting:超时等待, sleep()操作,不会释放锁
- Terminated:结束
基本操作
- 新建:Thread/Runnable
- 终止:stop(废弃)/interrupt
- 等待(wait)/通知(notify),必须配合Synchronous使用
- 挂起(suspend)/只需执行(resume),已废弃
- 等待线程结束join
- 谦让yield
- 优先级priority
线程池
Excutor
ExcutorService扩展Excutor
ThreadPoolExcutor线程池对象
Executors线程池工厂,返回指定类型的线程池对象
原理:
1线程池对象的构造函数:
- corePoolSize:线程池中的线程数量
- maximumPoolSize:线程池最大线程数量
- keepAliveTime:超过corePoolSize数量额线程的存活时间
- unit:时间单位
- workQueue:任务队列,有界队列:ArrayBlockingQueue/无界队列:LinkedBlockingQueue
- handler:拒绝策略
2线程池工厂:ThreadFactory,使用该工厂创建线程
3 锁
synchronized
- 原理:在JVM编译后,在入口处加上Monitorenter指令,结束位置或异常处加上monitorexit的指令;
- 作用:保证了JMM的三个特性:原子性/可见性(unlock之前保证变量会同步到主内存中去)/有序性(变量同一时刻只能由一个线程处理)
Lock/ReentrantLock
- 细粒度的锁,有lock()/unlock()/trylock操作;
- 可以实现公平锁和非公平锁(默认)
- 原理:AQS
volatile
- 保证可见性,不保证原子性
- 禁止指令重排序保证有序性
ThreadLocal
保存的数据可以看作线程内部局部变量;
实现:实现:当前线程有个ThreadLocalMap表,存储着当前ThreadLocal实例和对应的value;
乐观锁CAS(compare and swap)
synchronized和lock是悲观锁,CAS就是乐观锁
实现:修改数据时,需要三个参数:内存地址,旧的值,新的值, 只有旧的值等于当前内存地址中保存的值,才会更新为新的值
jvm对锁的优化:
- 锁消除:jvm会判断加锁的代码是否真的需要加锁,如果不需要会执行不加锁操作;
- 自旋锁:竞争锁失败后不会立即被挂起(线程的挂起需要操作系统配合,耗费资源),而是类似有个while(true)循环多少次后再去竞争锁;
- 偏向锁:同一个线程重复访问一个同步代码块时,可以直接获取到锁,免去了CAS加锁解锁的操作,使用锁竞争少的场景;
- 轻量级锁:
- 重量级锁
提高锁性能的建议
- 减少锁持有的时间
- 减少锁粒度
- 锁分离:读写锁
- 锁的粗化:频繁加锁释放锁也是不小的开销,粗化减少加锁次数
4 JUC并发包
Condition
Semaphore信号量
ReadWriteLock读写锁
CountDownLatch倒计时器
CycliBarrier栅栏
LockSupport线程阻塞工具
Fork/join
AQS(AbstractQueuedSynchronized)并发基础组件
并发容器
- 线程安全的Map:ConcurrentMap
- 线程安全的List:CopyOnWriteArrayList
- 高效队列ConcurrentLinkedQueue
- 阻塞队列BlockingQueue
- 双向队列Deque
- 随机数据结构SkipList
java并发知识点的更多相关文章
- Java并发知识点总结
前言:Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.同时,如果想要提升自己的技术,Java并发知识必不可少,这里简单整理了一些相关内容,希望可以起到抛砖引玉的作用 ...
- 【Java并发知识点汇总】
1,ArrayList 为什么线程不安全(https://www.jianshu.com/p/41be1efe5d65)
- Java 面试知识点解析(二)——高并发编程篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- 个人知识点总结——Java并发
Java并发实在是一个非常深的问题,这里仅仅简单记录一下Java并发的知识点.水太深.假设不花大量的时间感觉全然hold不住,可是眼下的精力全然不够,兴趣也不在这 什么是线程安全性 某个类的行为和其规 ...
- 干货:Java并发编程必懂知识点解析
本文大纲 并发编程三要素 原子性 原子,即一个不可再被分割的颗粒.在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败. 有序性 程序执行的顺序按照代码的先后顺序执行.(处理器可能会 ...
- Java并发相关知识点梳理和研究
1. 知识点思维导图 (图比较大,可以右键在新窗口打开) 2. 经典的wait()/notify()/notifyAll()实现生产者/消费者编程范式深入分析 & synchronized 注 ...
- java并发编程知识点备忘
最近有在回顾这方面的知识,稍微进行一些整理和归纳防止看了就忘记. 会随着进度不断更新内容,比较零散但尽量做的覆盖广一点. 如有错误烦请指正~ java线程状态图 线程活跃性问题 死锁 饥饿 活锁 饥饿 ...
- 最强Java并发编程详解:知识点梳理,BAT面试题等
本文原创更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解 ...
- JAVA并发编程J.U.C学习总结
前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...
随机推荐
- Linux 之数组
数组 和其他编程语言一样,Shell 也支持数组.数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element). Shell 并且没有限制数组的大小,理论上可以存放无限量的数据.和 ...
- T-MAX-测试总结
一.项目相关: 作业相关 具体描述 所属班级 2019秋福大软件工程实践Z班 作业要求 团队作业第五次-项目冲刺 作业正文 T-MAX组--测试总结 团队名称 T-MAX小组 作业目标 将团队的项目做 ...
- SQL Server 将查询结果集以XML形式展现 for xml path
for xml path,其实它就是将查询结果集以XML形式展现 双击打开
- OptaPlanner - AI Constraint satisfaction solver
OptaPlanner - 国内版 Binghttps://cn.bing.com/search?q=OptaPlanner&qs=n&form=QBRE&sp=-1& ...
- mybatis pagehelper 分页 失效
pagehelper 不分页几种情况的解决方法 - web洋仔 - CSDN博客https://blog.csdn.net/csdn___lyy/article/details/77160488 分页 ...
- darknet 的python接口使用
首先,python接口文件在安装好的darknet目录下的python文件夹,打开就可以看到 这里的darknet.py文件就是python接口 用编辑器打开查看最后部分代码: 使用十分简单,先将网络 ...
- Java 13 特性解读
Java 13 特性解读 转 https://blog.csdn.net/bjweimengshu/article/details/100978383 2017年8月,JCP执行委员会提出将 ...
- ActionBar 自定义布局定义
ActionBar 自定义布局定义 Android系统中ActionBar默认的布局不美观且难于控制,通过为ActionBar自定义布局的方式可以灵活控制ActionBar. 效果: 工具/原料 ...
- Flutter 中的路由
Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航. 并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.po ...
- windows nginx重启脚本.bat
在nginx.exe目录下新建txt文件写入 @echo offtaskkill /f /fi "IMAGENAME eq nginx.exe"start nginx.exe#pa ...