JUC
文章平均质量分 81
星夜孤帆
人之有吾,当应披荆棘,斩鬼熊,成就一番大事
展开
-
CPU密集型与IO密集型
一、CPU密集型(CPU bound)CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound。例如,一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部份时间用在三角函数和开根号的计算,便是属原创 2021-11-12 21:16:53 · 5681 阅读 · 0 评论 -
Java线程池源码分析
线程,程序执行流的最小执行单位,是行程中的实际运作单位,经常容易和进程这个概念混淆。那么,线程和进程究竟有什么区别呢?首先,进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者。可以说,进程中包含了多个可以同时运行的线程。ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。ThreadPoolExecutor.DiscardPolicy:也是丢.原创 2021-09-12 01:16:34 · 529 阅读 · 0 评论 -
ConcurrentHashMap实现原理及源码分析
一、ConcurrentHashMap跟HashMap,HashTable的对比1. HashMap不是线程安全:在并发环境下,可能会形成环状链表(扩容时可能造成,具体原因自行百度google或查看源码分析),导致get操作时,cpu空转,所以,在并发环境中使用HashMap是非常危险的2. HashTable是线程安全的:HashTable和HashMap的实现原理几乎一样,差别:1.HashTable不允许key和value为null;2.HashTable是线程安全的。原创 2021-08-29 20:30:02 · 1374 阅读 · 3 评论 -
Java定制化线程池
一、ThreadPoolExecutor.executepublic class CustomThreadPool { public static ThreadPoolExecutor getThreadPoolExecutor() { AtomicInteger threadNumber = new AtomicInteger(); return new ThreadPoolExecutor(4, 8,原创 2021-08-25 18:16:58 · 284 阅读 · 0 评论 -
深入学习并发编程中的Synchronized
一、并发编程中的三个问题二、Java内存模型三、Synchronized保证三大特性四、Synchronized的特性五、Synchronized原理六、CAS原理七、JDK6 Synchronized优化参考博客、视频教程原创 2021-08-02 20:47:19 · 342 阅读 · 0 评论 -
Synchronized锁升级过程
一、Synchronized的锁升级过程高效并发是从JDK 5到JDK 6的一个重要改进,HotSpot虛拟机开发团队在这个版本上花费了大量的精力去实现各种锁优化技术,包括偏向锁( Biased Locking )、轻量级锁( Lightweight Locking )和如适应性自旋(Adaptive Spinning)、锁消除( Lock Elimination)、锁粗化( Lock Coarsening )等等,这些技术都是为了在线程之间更高效地共享数据,以及解决竞争问题,从而提高程序的执原创 2021-08-02 01:43:47 · 7231 阅读 · 1 评论 -
CAS原理
一、CAS1.1 CAS概述和作用CAS的全称是: Compare And Swap(比较相同再交换)。是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。CAS的作用:CAS可以将比较和交换转换为原子操作,这个原子操作直接由CPU保证。CAS可以保证共享变量赋值时的原子操作。CAS操作依赖3个值:内存中的值V,旧的预估值X,要修改的新值B,如果旧的预估值X等于内存中的值V,就将新的值B保存到内存中。1.2CAS和volatile实现无锁并发二、CAS..原创 2021-08-02 00:52:22 · 3889 阅读 · 0 评论 -
Synchronized原理
一、Javap反汇编1.1 反汇编通过javap反汇编学习synchronized的原理我们编写一个简单的synchronized代码,如下:public class Demo05_monitor { private static Object obj = new Object(); public static void main(String[] args) { synchronized (obj) { System.out原创 2021-08-01 18:21:12 · 660 阅读 · 2 评论 -
Synchronized的特性
一、可重入特性1.1 什么是可重入一个线程可以多次执行synchronized,重复获取同一把锁。1.2. 可重入原理synchronized的锁对象中有一个计数器(recursions变量)会记录线程获得几次锁.1.3 可重入的好处1. 可以避免死锁2. 可以让我们更好的来封装代码总结:synchronized是可重入锁,内部锁对象中会有一个计数器记录线程获取几次锁啦,在执行完同步代码块时,计数器的数量会-1,直到计数器的数量为0,就释放这个锁。..原创 2021-08-01 17:22:27 · 1072 阅读 · 0 评论 -
Synchronized保证三大特性
synchronized能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。synchronized (锁对象) { // 受保护资源}一、synchronized保证原子性案例演示:5个线程各执行1000次 i++;对number++;增加同步代码块后,保证同一时间只有一个线程操作number++;。就不会出现安全问题。总结:synchronized保证原子性的原理,synchronized保证只有一个线程拿到锁,能够进入同步代码...原创 2021-08-01 15:48:59 · 2641 阅读 · 0 评论 -
Java内存模型
一、计算机结构1.1 计算机结构简介冯诺依曼,提出计算机由五大组成部分,输入设备,输出设备,存储器,控制器,运算器。1.2 CPU中央处理器,是计算机的控制和运算的核心,我们的程序最终都会变成指令让CPU去执行,处理程序中的数据。1.3 内存我们的程序都是在内存中运行的,内存会保存程序运行时的数据,供CPU处理。1.4 缓存CPU的运算速度和内存的访问速度相差比较大。这就导致CPU每次操作内存都要耗费很多等待时间。内存的读写速度成为了计算...原创 2021-08-01 13:24:17 · 216 阅读 · 1 评论 -
并发编程中的三个问题
一、可见性可见性(Visibility):是指一个线程对共享变量进行修改,另一个线程立即得到修改后的最新值。案例演示:一个线程根据boolean类型的标记flag, while循环,另一个线程改变这个flag变量的值,另一个线程并不会停止循环。/** * 目标:演示可见性问题 * 1.创建一个共享变量 * 2.创建一条线程不断读取共享变量 * 3.创建一条线程修改共享变量 */public class Test01Visibility { // 1. 创建一个共享变原创 2021-08-01 12:24:27 · 438 阅读 · 1 评论 -
Volatile指令重排详解
一、Volatile不可见性Volatile关键二、CPU的乱序执行CPU在进行读等待的同时执行指令,是CPU乱序的根源,不是乱,而是提高效率三、对象的创建过程对象的创建过程:创建->初始化->建立连接1.先申请内存,赋值默认值02.构造方法赋值初始值,83.建立连接,t->T四、DCL单例4.1 DCL单例代码DCL单例模式public class Singleton { pr...原创 2021-07-31 17:46:43 · 5487 阅读 · 1 评论 -
DCL单例模式
一、对象的创建过程视频教程对象的创建过程:创建->初始化->建立连接1.先申请内存,赋值默认值02.构造方法赋值初始值,83.建立连接,t->T二、DCL单例我们第一次写的单例模式是下面这样的:public class Singleton { private static Singleton instance = null; public static Singleton getInstance() { ..原创 2021-07-31 16:26:38 · 4644 阅读 · 3 评论 -
用户态与内核态
一、什么是用户态、内核态一般的操作系统对执行权限进行分级,分别为用用户态和内核态。用户态相较于内核态有较低的执行权限,很多操作是不被操作系统允许的,原因简单来说就是用户态出现问题(自己写的bug),也不能让操作系统崩溃呀。内核态相当于一个介于硬件与应用之间的层,内核有ring0的权限,可以执行任何cpu指令,也可以引用任何内存地址,包括外围设备,例如硬盘,网卡,权限等级最高。用户态则权利有限,例如在内存分配中,有一部分内存是仅为内核态使用的,用户态code则不允许访问那些内存地址...原创 2021-07-30 21:11:11 · 1703 阅读 · 0 评论 -
Synchronizd底层原理
一、CASCompare And Swap (Compare And Exchange) / 自旋 / 自旋锁 / 无锁因为经常配合循环操作,直到完成为止,所以泛指一类操作cas(v, a, b) ,变量v,期待值a, 修改值bABA问题,你的女朋友在离开你的这段儿时间经历了别的人,自旋就是你空转等待,一直等到她接纳你为止解决办法(版本号 AtomicStampedReference),基础类型简单值不需要版本号public class AtomicIntegerTest原创 2021-07-29 10:11:29 · 330 阅读 · 0 评论 -
AQS全面解析
一、前置知识二、是什么2.1 字面意思抽象的队列同步器通常地,AbstractQueuedSynchronizer简称为AQS2.2 技术翻译是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石,通过内置的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态。三、AQS为什么是JUC内容中最重要的基石3.1 和AQS有关的3.1.1 ReentrantLock3.1.2 CountDownLatch原创 2021-04-17 22:02:42 · 1078 阅读 · 1 评论 -
LockSupport
一、LockSupport1.1 LockSupport是什么Java ApiLockSupport中的park()和unpark()的作用分别是阻塞线程和解除阻塞线程1.2 线程等待唤醒机制(wait/notify)1.2.1 三种让线程等待和唤醒的方法1.2.2 Object类种的wait和notify方法实现线程等待和唤醒1.正常2.异常1wait方法和notify方法,两个都去掉同步代码块。3.异常21.2.3 Conditi.原创 2021-04-17 20:24:38 · 270 阅读 · 0 评论 -
可重入锁
一、可重入锁1.1 什么是可重入锁可重入锁又名递归锁是指在同一个线程外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock和Synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。1.2 可重入这四个字分库解释1.3 可重入锁种类1.3.1 隐式锁隐式锁,即synchronized关键字使用的锁,默认是可重入锁1.同步代码块2.同步原创 2021-04-17 15:15:06 · 2037 阅读 · 0 评论 -
Semaphore解析
一、Semaphore解析1.1 解析Semaphore:信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。1.2 争车位Demopublic class SemaphoreDemo { public static void main(String[] args) { //模拟3个停车位 Semaphore semaphore = new Semaphore(3); //模拟6部汽车原创 2020-12-08 10:40:58 · 249 阅读 · 0 评论 -
CyclicBarrier解析
一、CyclicBarrier解析1.1 解析CyclicBarrier的字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法。与CountDownLatch相反,CountDownLatch是从某一个值减到0,而CyclicBarrier是从0加到某一个值1.2 集齐7颗龙珠召唤原创 2020-12-08 10:10:14 · 203 阅读 · 0 评论 -
集合类不安全问题解析
一、并发修改异常1.1 ArrayList代码示例public class ContainerNotSafeDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); for (int i=1; i <=300; i++) { new Thread(() -> {原创 2020-12-07 11:37:44 · 223 阅读 · 0 评论 -
CountDownLatch解析
一、场景班里有七名同学,放学后,七名同学走完,班长关门走人。二、普通方法public class CountDownLatchDemo { public static void main(String[] args) { for (int i=0; i < 6; i++) { new Thread(() -> { System.out.println(Thread.currentThread().get原创 2020-12-01 14:38:41 · 296 阅读 · 0 评论