前言

先列出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并发知识点的更多相关文章

  1. Java并发知识点总结

    前言:Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.同时,如果想要提升自己的技术,Java并发知识必不可少,这里简单整理了一些相关内容,希望可以起到抛砖引玉的作用 ...

  2. 【Java并发知识点汇总】

    1,ArrayList 为什么线程不安全(https://www.jianshu.com/p/41be1efe5d65)

  3. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  4. 个人知识点总结——Java并发

    Java并发实在是一个非常深的问题,这里仅仅简单记录一下Java并发的知识点.水太深.假设不花大量的时间感觉全然hold不住,可是眼下的精力全然不够,兴趣也不在这 什么是线程安全性 某个类的行为和其规 ...

  5. 干货:Java并发编程必懂知识点解析

    本文大纲 并发编程三要素 原子性 原子,即一个不可再被分割的颗粒.在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败. 有序性 程序执行的顺序按照代码的先后顺序执行.(处理器可能会 ...

  6. Java并发相关知识点梳理和研究

    1. 知识点思维导图 (图比较大,可以右键在新窗口打开) 2. 经典的wait()/notify()/notifyAll()实现生产者/消费者编程范式深入分析 & synchronized 注 ...

  7. java并发编程知识点备忘

    最近有在回顾这方面的知识,稍微进行一些整理和归纳防止看了就忘记. 会随着进度不断更新内容,比较零散但尽量做的覆盖广一点. 如有错误烦请指正~ java线程状态图 线程活跃性问题 死锁 饥饿 活锁 饥饿 ...

  8. 最强Java并发编程详解:知识点梳理,BAT面试题等

    本文原创更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解 ...

  9. JAVA并发编程J.U.C学习总结

    前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...

随机推荐

  1. 在Typora中使用Latex

    https://blog.csdn.net/happyday_d/article/details/83715440 今后可能更多在本地编辑出Markdown之后复制上博客或者上传到GitHub.

  2. Lombok:小辣椒的安装与使用

    0.简介 Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具, 通过使用对应的注解,可以在编译源码的时候生成对应的方法,官网有详细的使用说明和视频. ...

  3. threejs行星运动小demo总结

    1.动画构思 就是中间有个红太阳,外面有几个行星球体环绕着太阳在各自轨道上做圆周运动.下面是效果图 2.基本要素 使用threejs的基本构件包括:渲染器(renderer),相机(camera),场 ...

  4. c标签简单应用

        <pager:column  property="ly" title="任务类型" width="10%">       ...

  5. 小程序中嵌套的h5页面设置分享转发

    场景描述:当在小程序中打开h5页面时,希望小程序的转发出去的标题,图片,跳转link可以通过h5通信实现自定义. 实现方式:通过h5给小程序通信,发送标题,图片,跳转link等信息,让小程序设置分享. ...

  6. Java中对象并不是都在堆上分配内存的

    转(https://blog.51cto.com/13906751/2153924) 前段时间,给星球的球友们专门码了一篇文章<深入分析Java的编译原理>,其中深入的介绍了Java中的j ...

  7. Spring Boot AOP 简易操作日志管理

    AOP (Aspect Oriented Programming) 面向切面编程. 业务有核心业务和边缘业务. 比如用户管理,菜单管理,权限管理,这些都属于核心业务. 比如日志管理,操作记录管理,这些 ...

  8. 【转】利用Python将多个PDF合并为一个

    本脚本用来合并pdf文件,输出的pdf文件按输入的pdf文件名生成书签 使用示例如下: python pdfmerge.py -p "D:\pdf-files" -o " ...

  9. Understanding glibc malloc

    https://wooyun.js.org/drops/深入理解%20glibc%20malloc.html https://sploitfun.wordpress.com/2015/02/10/un ...

  10. tansition-group 使用方法

    <transition-group name="breadcrumb"> <el-breadcrumb-item v-for="(item,index) ...