前言

先列出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. avalon中的ms-attr?

    <div class="item" id="move5" style="margin:0" > <a class=&quo ...

  2. meshing-网格加密

    ​原视频下载:http://yunpan.cn/cujvm8VbAPJZi  访问密码 0d3b

  3. 高可用Redis:Redis Cluster

    转(https://www.cnblogs.com/renpingsheng/p/9862485.html) Redis Cluster是Redis官方提供的Redis集群功能 1.为什么要实现Red ...

  4. Java 面向对象(十五)

    Lambda表达式 1. 函数式编程思想概述 在数学中,函数就是有输入量.输出量的一套计算方案,也就是"拿什么东西做什么事情".相对而言,面向对象过分强调"必须通过对象的 ...

  5. tx1 gpio

  6. php foreach 无法改变数组的值的问题

    转:http://www.cnblogs.com/yangwenxin/p/5845212.html 翻到PHP文档的foreach那页这样写道: “foreach 语法结构提供了遍历数组的简单方式. ...

  7. Apache的Mesos/Marathon与Google的Kubernets的区别

    Apache的Mesos与Google的Kubernets的区别 – China Hadoophttp://chinahadoop.com/archives/2150 有哪些是Apache Mesos ...

  8. zz SOLID (面向对象设计)

    SOLID (面向对象设计) 维基百科,自由的百科全书 跳到导航 跳到搜索 在程序设计领域, SOLID(单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期[1] ...

  9. python获取公网ip的几种方式

    python获取公网ip的几种方式 转 https://blog.csdn.net/conquerwave/article/details/77666226 from urllib2 import u ...

  10. [转]linux 下 使用 c / c++ 调用curl库 做通信开发

    example:   1. http://curl.haxx.se/libcurl/c/example.html  2. http://www.libcurl.org/book:  1. http:/ ...