并发编程
java并发编程学习
nrsc
::>_<::曾梦想当一个科学家::>_<::
展开
-
【并发编程】--- 线程池七大参数+四种拒绝策略 + 如何合理配置线程数等简介
源码地址:https://github.com/nieandsun/concurrent-study.git文章目录1 线程池七大参数2 RejectedExecutionHandler--- 四种拒绝策略(官方提供)3 threadFactory --- 线程工厂相关的注意事项4 如何自己new一个线程池 --- 简单结合了一下我们的项目5 实际工作中不允许使用Executors创建线程池的原因6 如何合理配置最大线程数1 线程池七大参数其实线程池的七大参数,我算一直都是比较熟悉的,因为我.原创 2020-05-13 22:14:54 · 1937 阅读 · 0 评论 -
【并发编程】--- 阻塞队列(BlockingQueue)简介
源码地址:https://github.com/nieandsun/concurrent-study.git文章目录1 阻塞队列的含义2 为什么用? 有什么好处?3 常用的BlockingQueue3.1 ArrayBlockingQueue简介3.2 LinkedBlockingQueue简介3.3 PriorityBlockingQueue简介3.4 DelayQueue简介3.5 SynchronousQueue简介3.6 LinkedTransferQueue简介3.7 LinkedBloc.原创 2020-05-12 01:00:19 · 750 阅读 · 0 评论 -
【并发编程】 --- 从五个维度对比synchronized关键字和Lock
文章目录维度1 --- 从原始构成上来说维度2 --- 从使用方法上来说维度3 --- 从等待是否可中断上来说维度4 --- 从加锁是否公平角度来说维度5 --- 从线程间的通信来说维度1 — 从原始构成上来说synchronized是关键字,属于JVM层面Lock是具体类(java.util.concurrent.Locks.Lock)是api层面的锁维度2 — 从使用方法上来说synchronized不需要用户手动去释放锁,当synchronized代码执行完后系统会自动让线程释放对原创 2020-05-10 20:11:40 · 447 阅读 · 2 评论 -
【并发编程】 --- Lock/Condition完成生产者消费者模式+ABCABC顺序打印问题
源码地址:https://github.com/nieandsun/concurrent-study.git文章目录1 生产者消费者问题2 ABCABC。。。三个线程顺序打印问题2.1 基本不费脑子的实现方式 --- 且比较容易感受到定点通知的含义2.2 比较灵活的方式1 生产者消费者问题使用一个Condition极其类似于wait、notifyAll的使用方法题目 + 题目分析可参考我之前写的一篇文章《【并发编程】 — 线程间的通信wait、notify、notifyAll》。这里直接.原创 2020-05-10 19:32:04 · 683 阅读 · 0 评论 -
【并发编程&JVM】--- 强软弱虚四种引用 + ThreadLocal内存泄漏原因分析
文章目录【1】强软弱虚四种引用【1.1】强引用【1.2】软引用【1.3】弱引用【1.4】虚引用【2】ThreadLocal内存泄漏问题分析本篇文章整理自马士兵老师的公开课(哔哩哔哩)【1】强软弱虚四种引用【1.1】强引用平时new出来的对象,只要有引用在即使发生GC也回收不了【1.2】软引用【1.3】弱引用【1.4】虚引用【2】ThreadLocal内存泄漏问题分析...原创 2020-05-08 01:04:51 · 947 阅读 · 0 评论 -
【并发编程】 --- Reentrantlock源码解析5:再探不可中断性 + 线程unpark后诡异的Thread.interrupted()判断
文章目录1 想要读懂这篇文章必须要拥有的前置知识2 想些这篇文章的原因3 困扰我很久的Reentrantlock源代码1 --- 貌似无用的变量failed4 困扰我很久的Reentrantlock源代码2 --- unpark后为啥要来个Thread.interrupted();5 小记源码地址:https://github.com/nieandsun/concurrent-study.g...原创 2020-04-12 19:47:53 · 699 阅读 · 4 评论 -
【并发编程】 --- Reentrantlock源码解析4:公平锁加锁过程中 [判断当前线程是否要排队的具体细节] 超详细解析
文章目录1 简单回顾2 高并发环境下当前线程使用公平锁判断自己是否要排队的具体细节2.0 源码 + 宏观分析2.1 h != t2.1.1 h != t 不成立时(即h等于t时) ---> 不用排队的原因2.1.1.1 情况1 ---> h和t都等于null ---> 不用排队2.1.1.2 情况2 ---> h和t不等于null,但h=t的情况 ---> 不用排...原创 2020-04-11 22:44:52 · 779 阅读 · 2 评论 -
【并发编程】 --- Reentrantlock源码解析3:公平锁释放锁过程超详细解析
文章目录1 公平锁释放锁的过程1.1 从源码中看公平锁释放锁的过程1.2 以源码为基础总结出的公平锁释放锁的流程2 需要思考的问题2.1 问题1 --- 释放锁的过程中有可能导致尾节点的ws为-1么 ---> 不可能2.2 问题2 --- 公平锁加锁和解锁的过程还有值得探究的地方么? ---> 当然有!!!源码地址:https://github.com/nieandsun/conc...原创 2020-04-11 10:30:34 · 900 阅读 · 1 评论 -
【并发编程】 --- Reentrantlock源码解析2:公平锁加锁过程超详细解析
文章目录1 前情回顾 --- 同步方法交替执行时Reentrantlock公平锁的逻辑2源码地址:https://github.com/nieandsun/concurrent-study.git1 前情回顾 — 同步方法交替执行时Reentrantlock公平锁的逻辑前面一篇文章《【并发编程】 — Reentrantlock源码解析1:同步方法交替执行的处理逻辑》讲过无论是synch...原创 2020-04-10 00:48:41 · 686 阅读 · 5 评论 -
【并发编程】 --- synchronized锁的升级过程 + JDK1.6对synchronized关键字的其他优化简介
文章目录源码地址:https://github.com/nieandsun/concurrent-study.git原创 2020-04-06 14:38:42 · 953 阅读 · 1 评论 -
【并发编程】 --- 原来java对象的布局是可以被这样证明的!!!
文章目录源码地址:https://github.com/nieandsun/concurrent-study.git原创 2020-04-05 15:24:04 · 835 阅读 · 1 评论 -
【并发编程】 --- Reentrantlock源码解析1:同步方法交替执行的处理逻辑
文章目录1 Reentrantlock前置知识1.1 理清代码同步的本质1.2 Reentrantlock的核心三板斧1.2.1 Compare And Swap(CAS) --- 保证同一时刻只有一个线程可以抢到锁1.2.2 park & unpark --- 让竞争不到锁的线程立刻挂起和从挂起中唤醒1.2.3 自旋 --- 确保线程尽量不进行park1.3 AQS --- 保证被挂...原创 2020-04-04 23:40:51 · 1915 阅读 · 6 评论 -
【并发编程】 --- 从JVM源码的角度进一步去理解synchronized关键字的原理
文章目录1 openjdk源码下载2 monitor对象简介上篇文章《【并发编程】 — 从字节码指令的角度去理解synchronized关键字的原理》从字节码指令的角度讲解了synchronized关键字的原理,从中可以知道其实synchronized关键字真正锁的是锁对象关联的monitor对象,那(1)这个monitor对象到底什么呢?(2)monitorentor、monitorex...原创 2020-04-04 01:54:52 · 1037 阅读 · 0 评论 -
【并发编程】 --- 从字节码指令的角度去理解synchronized关键字的原理
文章目录1 synchronized关键字反汇编指令源码地址:https://github.com/nieandsun/concurrent-study.git不知道大家有没有这样一种感觉,对于synchronized关键字我(1)会使用,(2)懂原理,但仍然还是想找到官方的证明,告诉自己这一切都是正确的,对的。 — 或许不止synchronized关键字,好多问题貌似都这样。。。...原创 2020-04-02 13:31:14 · 736 阅读 · 0 评论 -
【并发编程】 --- synchronized/ReentrantLock两大特性(可重入性和不可中断性)介绍
文章目录1 可重入特性1.1 可重入的含义及synchronized可重入特性演示1.2 简单说一下synchronized可重入原理2 synchronized不可中断特性 --- interrupt和stop都不可中断2.1 不可中断的含义及synchronized不可中断特性演示2.2 ReentrantLock的可中断与不可中断2.2.1 ReentrantLock使用lock()加锁...原创 2020-03-29 18:32:06 · 1047 阅读 · 3 评论 -
【并发编程】 --- Runnable、Callable、Future和FutureTask之间的关系
文章目录1 创建一个线程的方式到底有几种???2 如何使用FutureTask 、Future、Callable、线程池实现线程2.1 FutureTask + Callable实现多线程2.2 线程池+Future+Callable 实现多线程3 Runnable、Callable、Future和FutureTask之间的关系3.1 整体关系介绍3.2 简单看一下源码3.3 四者关系小结源...原创 2020-03-28 18:00:34 · 1120 阅读 · 0 评论 -
【并发编程】 --- Semaphore原理简介 + 使用方法
文章目录1 原理简介2 基本使用方法2.1 demo1 --- 每次获取一个许可,将线程并发数控制为N个2.2 demo2 --- 每次获取多个许可(或者说所有可获取的许可),使线程并发数变为13 其他玩法3.1 demo3 --- 尝试获取许可,如果获取不到,直接舍弃 ★★★3.2 demo4 --- 尝试一段时间内获取许可,如果获取不到,直接舍弃 ★★★源码地址:https://g...原创 2020-03-28 00:33:28 · 579 阅读 · 0 评论 -
【并发编程】 --- CyclicBarrier原理简介 + 使用方法
文章目录1 原理简介1.1 CyclicBarrier屏障原理1.1.1 await为空参时1.1.2 await传入时间参数时1.2 CyclicBarrier中的循环是什么意思2 CountDownLatch和CyclicBarrier简单比较3 具体使用方法3.1 demo1 --- awit不传入时间,指定数量的线程到达屏障点后,再一起抢占运行(循环拦截)3.2 demo2 --- awa...原创 2020-03-26 11:59:47 · 947 阅读 · 2 评论 -
【并发编程】 --- CountDownLatch原理简介 + 使用方法
文章目录1 原理简介2 具体使用方法2.1 demo1 --- await不传入时间,保证当前线程的其他操作在最后执行2.2 demo2 --- await传入时间t,当前线程等其他线程时间t后就运行其他操作2.3 发令枪源码地址:https://github.com/nieandsun/concurrent-study.git其实我自认为CountDownLatch类是进入AQS世...原创 2020-03-24 00:25:54 · 1870 阅读 · 4 评论 -
【并发编程】 --- Compare And Swap(CAS)原理分析
文章目录1 什么是CAS?1.1 加锁和CAS解决原子性问题的不同原理1.2 CAS原理分析2 CAS可能的问题2.1 ABA问题2.2 循环时间长开销大2.3只能保证一个共享变量的原子操作3 JDK中的相关原子操作类简介 --- 底层CAS机制3.1 AtomicInteger3.2 AtomicIntegerArray3.3更新引用类型3.4 原子更新字段类4源码地址:https://g...原创 2020-03-22 21:59:41 · 10950 阅读 · 7 评论 -
【并发编程】 --- 线程间的通信wait、notify、notifyAll
文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 --- ABCABC。。。三个线程顺序打印问题2.1.1 题目2.1.2 题目分析2.1.3 我的答案2.2 生产者消费者问题2.2.1 题目2.2.2 题目...原创 2020-03-21 12:08:16 · 2211 阅读 · 13 评论 -
【并发编程】 --- synchronized的使用姿势
文章目录1 总览2 synchronized修饰静态方法3 synchronized修饰静态方法4 synchronized修饰非静态代码块源码地址:https://github.com/nieandsun/concurrent-study.git1 总览synchronized的使用姿势总得来说有三种,分别为:修饰普通方法修饰静态方法修饰非静态代码块前两种姿势比较单一,而最...原创 2020-03-16 16:41:59 · 715 阅读 · 0 评论 -
【并发编程】 --- 伪共享(False Sharing)底层原理及其解决方式
文章目录1 什么是伪共享1.1 从疑问说起 --- 难道JMM中不存在局部性原理???1.2 缓存行的概念1.3 伪共享(False Sharing)的概念 + 其可能引发的性能问题2 如何避免伪共享 --- 数据填充2.1 不使用数据填充时的效率验证2.2 手动进行数据填充的效率验证2.3 通过java8新特性@sun.misc.Contended注解进行数据填充的效率验证源码地址:ht...原创 2020-03-15 12:38:47 · 2685 阅读 · 3 评论 -
【并发编程】--- volatile底层原理 + happens-before规则
文章目录1 volatile如何保证可见性2 volatile为什么不能保证原子性问题3 volatile可以保证有序性的原因3.1 单线程禁止重排序的规则 as-if-serial3.1 多线程禁止重排序的规则 happens-before源码地址:https://github.com/nieandsun/concurrent-study.git1 volatile如何保证可见性上篇...原创 2020-03-15 00:42:53 · 2671 阅读 · 2 评论 -
【并发编程】--- 并发编程中的可见性、原子性、有序性问题
文章目录1 可见性问题1.1 复现可见性问题1.2 可见性问题产生的原因2 原子性问题3 有序性问题3.1 复现有序性问题3.2 有序性问题产生的原因源码地址:https://github.com/nieandsun/concurrent-study.git1 可见性问题1.1 复现可见性问题可见性问题测试代码如下:package com.nrsc.ch1.base.jmm....原创 2020-03-13 17:47:45 · 872 阅读 · 1 评论 -
【并发编程】--- java守护线程简介
文章目录1 守护线程概念简介2 守护线程示例代码及注意事项源码地址:https://github.com/nieandsun/concurrent-study.git1 守护线程概念简介Daemon(守护)线程是一种支持型线程,它主要被用作程序中的后台调度以及支持性工作。当一个Java虚拟机中不存在非Daemon线程的时候,Java虚拟机就会退出。可以通过调用Thread.setDae...原创 2020-03-08 20:34:53 · 523 阅读 · 0 评论 -
【并发编程】--- Thread类中的join方法
文章目录1 join方法原理2 join测试代码和测试结果源码地址:https://github.com/nieandsun/concurrent-study.git1 join方法原理原理如下:注意: 只有先开启了线程,在进行join才有效。2 join测试代码和测试结果测试代码package com.nrsc.ch1.base;import com.nrsc.uti...原创 2020-03-08 18:07:39 · 683 阅读 · 0 评论 -
【并发编程】--- interrupt、interrupted和isInterrupted使用详解
文章目录1 为何不建议用stop方法中断线程2 interrupt、interrupted和isInterrupted方法介绍3 interrupt、interrupted和isInterrupted方法测试3.1 被中断线程感知到中断请求,但不理会3.2 isInterrupted方法感知中断请求 --- 仅仅判断当前线程的中断标识3.3 interrupted方法感知中断请求 --- ...原创 2020-03-08 12:52:56 · 2985 阅读 · 1 评论