并发
并发相关知识梳理
1024个秘密
好好工作,好好学习,好好生活。
展开
-
并发编程-线程池详解(ThreadPoolExecutor源码分析)
线程池详解一、为什么要有线程池?当只有线程的时候,会有几个很明显的缺点:1、来一个任务创建一个线程,线程创建的数量不可控;2、频繁的创建和销毁线程,会消耗很多资源;所以,就有了”线程池“。它的优势:1、限流 -> 控制线程数量2、降低频繁创建和销毁线程3、对于任务的响应速度更快(不再需要创建线程,而是复用已有的线程,所以就更快啦)二、JAVA中提供的线程池Executo...原创 2020-07-14 09:36:24 · 412 阅读 · 0 评论 -
并发编程 - Java 乐观锁 VS 悲观锁
乐观锁 VS 悲观锁参考链接:https://mp.weixin.qq.com/s/E2fOUHOabm10k_EVugX08g原创 2019-07-08 20:22:14 · 338 阅读 · 0 评论 -
并发编程 - Java线程的一大堆
一、通用的线程生命周期1、初始状态:线程被创建,但是还允许被分配cpu执行。2、可运行状态:线程可以分配cpu执行。3、运行状态:线程正在被cpu执行。4、休眠状态:运行的时候,如果被阻塞或者等待某个事件,就会从运行状态转为休眠状态,同时释放cpu资源,如果等到了事件,则会转为可运行状态;5、结束状态:线程运行完成或者出现异常。二、通用的线程生命周期...原创 2020-07-12 19:14:25 · 157 阅读 · 0 评论 -
并发编程 - 等待/通知机制
一、为啥需要等待 - 通知机制假设线程没拿到锁,一直循环尝试去获取锁,这样效率是很低的,如果有通知机制,那么得到通知了,再执行即可。二、何为等待 - 通知医院就医顺序:1、患者挂号,等待叫号。 (等锁)2、患者被叫号,医生诊治。 (拿到锁)3、医生问诊,开检查单。(线程缺少执行条件,释放锁)4、患者检查完,重新等待叫号。(重新尝试拿锁)5、患者被叫好,医生诊治。(拿锁-执行)三、如何实现等待 - 通知?synchronized 配合wait(),notify(),notifyAll()原创 2020-07-08 09:23:21 · 185 阅读 · 0 评论 -
并发编程 - 死锁如何处理
一、死锁是个啥?关于银行转账问题,a转给b,c转给d,涉及到两个用户,那么是否可以拿两把锁来操作呢?如下:这种骚操作就可能引起死锁哦。 如下:原创 2020-07-07 21:01:19 · 221 阅读 · 0 评论 -
并发编程 - 互斥锁synchronized
一、如何解决原子性问题?原子性问题的产生原因是“线程切换”,那么只要禁止线程切换就可以避免原子性问题,不管是单核还是多核cpu,都必须禁止同一时刻只有一个线程在执行。二、锁锁的含义:保护需要保护的资源三、synchronized(同步锁/互斥锁)java编译器会在synchronized修饰的代码前后加上加锁和解锁的功能。3.1 修饰普通方法 = 锁住当前实例示例:多个线程同时访问同一同步方法,则串行执行,即一个线程执行完,才会轮到下一个线程。public class Synchroniz原创 2020-07-05 22:37:58 · 306 阅读 · 0 评论 -
并发编程 - Happens-before
一、Happens-beforeHappens-before: 前面的操作结果对后续操作是可见的。要求编译器的优化必须遵许Happens-before原则二、Happens-before 六大原则2.1 程序的顺序性原则单线程中,某一个变量的修改对后续的操作一定是可见的。如下所示的程序中,第1句和第2句的顺序编译器可以调换(不影响程序结果),但是1和2必须要在3之前执行完成才可以哦(3有volatile关键字)。public class Test { volatile static i原创 2020-07-03 22:13:56 · 157 阅读 · 0 评论 -
并发编程 - Lock的通信方式Condition的使用和源码解析
Condition的使用和原理Lock的通信方式:conditionCondition的使用ConditionWaitpublic class ConditionWait implements Runnable{ private Lock lock; private Condition condition; public ConditionWait(Lock l...原创 2019-08-31 22:03:12 · 380 阅读 · 1 评论 -
并发编程 - 重入锁以及AQS源码
一、J.U.C简介Java.util.concurrent 并发工具包,包括线程池、阻塞队列、计时器、同步器、并发集合等;二、Lock的基本应用J.U.C的核心组件。三、ReentrantLock重入锁四、AQS原理分析五、AQS源码分析...原创 2019-08-31 18:46:05 · 394 阅读 · 0 评论 -
并发编程 - 对象的wait / notify方法实现线程的通信机制
例如常见的生产者 - 消费者 模式:一边生产,一边消费。需要线程之间的通信,就可以利用wait / notify方法来实现。object.wait() 和 object.notify()wait的作用:1、实现线程的阻塞;2、会释放当前的同步锁notify的作用:唤醒一个被阻塞的线程;notifyAll的作用:唤醒所有被阻塞的线程,再去重新竞争。代码demo:/** * @descr...原创 2019-07-28 21:02:20 · 405 阅读 · 0 评论 -
并发编程 - 线程基础篇
一、并发的发展历史1、真空管 / 穿孔打卡工作流:把程序写在纸上,打成卡片,把卡片的程序输入到计算机上,电脑运行出结果打印到打印机上。最大的问题,计算机在等程序输入的时候,会处于空闲状态。2、晶体管 / 批处理操作系统工作流:把程序写在卡片上,读入到磁盘机上,电脑通过读取磁盘机上的内容进行运行,将结果输入到打印机上。解决了计算机空闲问题,计算机会一直处于运行状态。带来的问题:IO问题...原创 2019-07-17 21:50:24 · 167 阅读 · 0 评论 -
并发编程 - 偏向锁、轻量级锁、重量级锁的升级
线程安全 & 线程不安全线程不安全: 多个线程同时去访问一块共享资源,会出现数据不一致的问题。demo:public class AtomicDemo { private static int count = 0; public static void incr(){ try { Thread.sleep(1); ...原创 2019-07-28 20:03:49 · 485 阅读 · 1 评论 -
并发编程 - volatile关键字底层详解
一、volatile能干什么?如下所示的代码里,有t1线程和主线程,主线程改变了stop的值,但是t1线程并不知道,一直在执行。public class Test { public static boolean stop = false; public static void main(String[] args) throws InterruptedException { ...原创 2019-08-25 20:28:50 · 491 阅读 · 0 评论 -
并发编程 - 可见性,原子性和有序性问题
并发一、并发的根源cpu、内存、I/O设备 三者的速度差异二、并发带来的问题2.1 缓存导致的可见性可见性:一个线程对共享变量的修改,另一个线程可以立马看到,称为“可见性”(你的修改我能看见)。2.2 线程切换带来的原子性问题把一个或者多个操作在cpu执行过程中不被中断的特性称为“原子性”(原子哦,不可切割)。非原子性操作:2.3 编译优化带来的有序性问题编译器为了优化性能,可能会调整指令顺序哦。public class Singleton { static Singleton原创 2020-07-02 21:37:40 · 148 阅读 · 0 评论