![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC并发编程
线程并发,同步,锁等
青草离..秋风起
这个作者很懒,什么都没留下…
展开
-
深入理解JMM(Java 内存模型)
深入理解JMMMESI缓存一致性协议为什么要有MESI?MESIJMMJava内存模型与硬件内存架构的关系JMM存在的必要性JMM数据原子操作volatile原理与内存语义同步规则 MESI缓存一致性协议 为什么要有MESI? 现在的处理器都是多核处理器,并且每个核都带有多个缓存(指令缓存和数据缓存,见下图)。为什么需要缓存呢,这是因为CPU访问内存的速度比较慢,所以在CPU和内存之间加了个缓存以提高访问速度。既然每个核都有缓存,那么假设两个核或者多个核同时访问同一个变量时这些缓存是如何进行同步的呢(缓存细原创 2020-09-03 06:20:06 · 741 阅读 · 0 评论 -
死锁编码及定位分析
死锁编码及定位分析死锁概念死锁编码定位分析 死锁概念 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去, 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。 产生死锁的主要原因: 系统资源不足 进程运行推进的顺序不合适 资源分配不当 死锁编码 public class DeadLockDemo { public static void main(String[] args原创 2020-08-28 16:56:19 · 121 阅读 · 0 评论 -
线程池中如何配置合理的参数
线程池配置合理的参数自定义线程池如何配置合理的参数 自定义线程池 在实际开发中,基本上都会使用自定义的线程池,而不会使用Executors中JDK提供的线程池。为什么不适用自带的呢? 参考阿里巴巴java开发手册 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 说明:使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。 线程池不允许使用Executors去创建原创 2020-08-28 16:30:00 · 1506 阅读 · 0 评论 -
线程池ThreadPoolExecutor的使用与原理
线程池ThreadPoolExecutor的使用与原理为什么使用线程池,其优势基本概念优势线程池如何使用架构实现编码实现1. Executors.newFixedThreadPool(int)2. Executors.newSingleThreadExecutor()3. Executors.newCachedThreadPool()线程池的七大参数底层工作原理 为什么使用线程池,其优势 基本概念 线程池的工作主要是控制运行的线程的数量,处理过程中将任务加入队列,然后在线程创建后启动这些任务,如果线程超过了原创 2020-08-28 14:49:20 · 112 阅读 · 0 评论 -
阻塞队列BlockingQueue 介绍与使用
阻塞队列什么是BlockingQueueBlockingQueue的优点BlockingQueue核心方法框架及种类框架介绍ArrayBlockingQueuelinkedBlockingQueueSynchronousQueue应用场景 什么是BlockingQueue 阻塞队列,顾名思义,首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如图所示 : 线程1往阻塞队列中添加元素二线程2从队列中移除元素 当阻塞队列是空时,从队列中获取元素的操作将会被阻塞 当阻塞队列是满时,往队列中添加元素的操原创 2020-08-27 17:39:55 · 876 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、Semaphore 介绍与案例
CountDownLatch、CyclicBarrier、SemaphoreCountDownLatch案例CyclicBarrier构造方法案例Semaphore案例 CountDownLatch CountDownLatch倒计时锁(闭锁):是一个同步的工具类,使一个线程阻塞,等待其他线程都运行结束后再被唤醒。与它一同的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。 CountDownLatch主要有两个方法,当一个或多个线程调原创 2020-08-26 23:46:11 · 171 阅读 · 0 评论 -
独占锁 / 共享锁、读写锁
独占锁 / 共享锁、读写锁独占锁和共享锁读写锁案例如下 独占锁和共享锁 独占锁: 指该锁一次只能被一个线程所持有。对ReentrantLockSynchronized而言都是独占锁。 共享锁: 指該锁可被多个线程所持有。 读写锁 ReadWriteLock是一个读写锁接口,ReentrantReadWriteLock类(可重入读写锁)是读写锁ReadWriteLock的一个实现类;ReentrantReadWriteLock可重入读写锁有两种模式,其写模式writeLock())是一个独占锁,其读模式 (r原创 2020-08-26 17:45:20 · 304 阅读 · 0 评论 -
简单介绍 自旋锁SpinLock
自旋锁SpinLock什么是自旋锁自旋锁实现 什么是自旋锁 自旋锁 是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁。 优点:减少线程的阻塞以及线程上下文切换的的消耗。常规锁在线程获取不到锁的时候会阻塞挂起,一直等待唤醒,而从挂起到唤醒是需要经过内核态到用户态的相互转换,这样的上下文切换使性能下降。 缺点:循环会消耗CPU。如果线程长期的获取不到锁,那么会一直循环,会消耗CPU。 自旋锁实现 自旋锁的实现需要借助CAS,因为需要通过CAS来判断当前持有锁的线程是否为null或自身。 publ原创 2020-08-26 16:43:22 · 335 阅读 · 0 评论 -
可重入锁:synchronized & ReentrantLock
可重入锁什么是可重入锁?可重入锁的意义:非可重入锁会发生什么情况呢?Synchronized & ReentrantLocksynchronized案例ReentrantLock案例 什么是可重入锁? 可重入锁 又叫 递归锁,指当一个线程已经获得某个锁,可以再次获取锁而不会出现死锁。 什么意思呢? 同一个线程外层函数获得锁之后,内层递归函数也想要获得该锁,那么这个线程可以重复的获取该锁,即上了多把锁。 可重入锁的意义: 同一个线程多次获取锁,而不会出现死锁。 非可重入锁会发生什么情况呢? 当一个线原创 2020-08-26 15:35:24 · 179 阅读 · 0 评论 -
JUC:公平锁和非公平锁
公平锁和非公平锁什么是公平锁和非公平锁公平锁和非公平锁区别是什么 什么是公平锁和非公平锁 公平锁: 当一个线程想要去获取锁时,发现该锁已经被另一个线程占用,那么该线程就要放入一个FIFO等待队列中等待,当持有锁的线程使用完时释放锁后,再根据队列的先后顺序唤醒一个线程去持有锁。即线程持有锁的顺序要讲先来后到,不能插队。 非公平锁: 当一个线程想要去获取锁时,发现该锁已经被另一个线程占用,那么该线程就试图去获取锁,如果获取成功就持有锁,获取失败就回到等待队列当中等待。指多个线程获取锁的顺序并不是按照申请锁的顺序原创 2020-08-25 02:51:35 · 233 阅读 · 0 评论 -
一遍了解 值传递和引用传递
值传递和引用传递基本类型对象类型案例案例分析案例1案例2案例3 对于java变量的传递到底是传递值还是传递引用,一般而言,基本类型的变量是值传递;对象类型的变量是引用传递。其实引用传递也是传递的值,别懵,看完就懂! 基本类型 就基本类型int而言,变量a存放的就是字面值3 int a = 3; int b = a; //将a 的值复制一份,再赋值给b; a = 5;//重新修改a的值 最终a和b的值为: a = 5; b = 3; b = a,其实就是把a的值拷贝一份,然后再赋值给b;因此a和原创 2020-08-25 01:36:07 · 110 阅读 · 0 评论 -
JUC:非线程安全的集合类
JUC:非线程安全的集合类故障现象导致原因解决方案VectorCollectionsCopyOnWrite容器 故障现象 ArrayList、HashMap、HashSet集合都不是线程安全的集合。在简单的单线编程过程中并不会发现这些集合类会出现什么线程相关的错误,而在多线程并发编程过程中如果多个线程并发的操作这些集合可能会报这样的错: java.util.ConcurrentModificationException 表示并发修改异常 导致原因 并发争抢修改导致,参考我们的花名册签名情况。一“个人正原创 2020-08-24 02:13:08 · 337 阅读 · 0 评论 -
解析CAS算法原理
解析CAS算法原理什么是CAS?CAS原理概念实现形式底层原理案例CAS的缺点 什么是CAS? CAS,全称Compare And Swap,顾名思义,比较再交换。它是一种常用于解决并发编程问题的一种思想。 它是一条CPU并发原语。它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。 CAS原理 概念 CAS并发原语体现在JAVA语言中就是sun.misc.Unsafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会 帮我们实现出CAS汇 编指令。这是一种完全依赖于原创 2020-08-23 01:11:30 · 1498 阅读 · 0 评论 -
JUC: 浅析Volatile关键字
Volatile关键字 在讲解Volatile关键字关键字之前,我们先来引入一些概念,有助于后续的理解。 JVM(java内存模型)规定:多于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立的工作内存,并且线程只能访问自己的工作内存,不可以访问其他线程的工作内存。 &nbs原创 2020-08-21 02:41:11 · 154 阅读 · 0 评论