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. ...
随机推荐
- hive(2)数据类型和文件格式
基本的数据类型 Hive支持关系型数据中大多数基本的数据类型,同时也支持关系型数据库中很少出现的三种集合数据类型. 集合数据类型 Hive中的列支持使用struct.map.array集合数据类型,下 ...
- SpringMVC的请求转发的三种方法
SpringMVC请求转发的三种方法 首先明白请求转发是一次请求,地址栏不会发生变化,区别于重定向.springmvc环境自行配置. 以下举例中存在如下文件/WEB-INF/pages/success ...
- Zk单机多实例部署
一.环境准备 当前环境:centos7.3一台软件版本:zookeeper-3.5.2部署目录:/usr/local/zookeeper启动端口:2181,2182,2183配置文件:/usr/loc ...
- NOIP提高组初战告捷
前天第一次参加NOIP初赛,竟然提高组考了57分进入复赛啊啊!原本自己估分是52竟然估少了[滑稽]这个成绩 是我们学校初一提高组成绩最高 还是不错(出乎我意料之外)的!
- 2018-2019-2 网络对抗技术 20165212 Exp6 信息搜集与漏洞扫描
2018-2019-2 网络对抗技术 20165212 Exp6 信息搜集与漏洞扫描 原理与实践说明 1.实践原理 信息搜集:渗透测试中首先要做的重要事项之一,搜集关于目标机器的一切信息 间接收集 D ...
- No value specified for Date
现象 使用BeanUtils复制对象属性,结果抛出No value specified for Date异常. 原因 是数据源orig有一个参数是java.util.Date类型,没有初始化值,调用了 ...
- 惠普打印机和扫描仪修复医生 HP Print and Scan Doctor
https://support.hp.com/cn-zh/topic/printscandoctor-printing-problems http://ftp.hp.com/pub/printers/ ...
- flutter DropdownButton使用
import 'package:flutter/material.dart'; class MyStatefulWidget extends StatefulWidget { MyStatefulWi ...
- TypeScript泛型类 - 把类作为参数类型的泛型类
/* TypeScript泛型类 - 把类作为参数类型的泛型类 */ /* 泛类:泛型可以帮助我们避免重复的代码以及对不特定数据类型的支持(类型校验),下面我们看看把类当做参数的泛型类 1.定义个类 ...
- java获取全部子类或接口的全部实现
在JAVA中,获取一个类的全部父类是比较简单的,只需要通过反射(Class的getSuperclass()方法)即可.然而,如果想获得一个类的所有子类,或者获得实现某一个接口的所有实现类,相对比较麻烦 ...