
JUC
文章平均质量分 66
夹毛局的程序员
这个作者很懒,什么都没留下…
展开
-
14.AQS详细Debug解析
AQS详解AQS 全程AbstractQueuedLongSynchronizer 抽象队列同步器用来构建锁或者其他同步器组件的重量级基础框架及整个JUC体系的基石,通过内置的FIFO队列来完成资源获取线程的排队工作,并通过一个int state变量来表示持有锁的状态抢到资源的线程直接继续执行,抢占不到资源的线程必然涉及到一个队列等候机制如果共享资源被占用,就需要阻塞等待唤醒的机制保证锁分配队列机制在AQS中主要是用CLH队列的变体实现,将暂时获取不到锁的线程加入队列中CLH队列将请求共享资源原创 2021-01-12 16:56:32 · 210 阅读 · 0 评论 -
13.LookSupport解析
LockSupportLockSupport是用来创建锁和其他同步类的基本线程阻塞原语.主要核心API为park和unpark方法分别用来阻塞线程和解除阻塞线程三种让线程等待和唤醒的方式使用Object类中的wait 和 notify方法进行线程的等待和唤醒使用JUC中的Conditon的await 和singal方法进行线程的等待和唤醒使用LockSupport的 park和unpark方法阻塞唤醒当前线程三种线程等待唤醒方式的区别Object的wait 和 notify必须使用s原创 2021-01-11 14:46:09 · 399 阅读 · 0 评论 -
12.死锁定位
死锁两个或两个以上的进程在执行过程中,相互争抢资源造成相互等待的现象,若无外力干涉他们这种状态将一直持续下去.死锁可能会出现程序假死.当资源充足的情况下,进程的资源请求都能得到满足,出现死锁几率较低,但在争抢有限资源的情况下可能会陷入死锁产生死锁的原因系统资源不足进程运行顺序不当资源分配不当死锁产生的四个必要条件互斥解决方法: 把互斥的共享资源封装成可同时访问占有且等待解决方法: 进程请求资源时,要求不占用任何其他资源,也就是他必须一次性申请到所有资源,这种方式会导致资源效原创 2021-01-08 15:41:10 · 113 阅读 · 0 评论 -
11.线程池
线程池线程池需要时控制运行的线程数量,处理过程中,将任务放入队列中,然后线程创建之后启动这些任务.如果线程数量超过了最大线程排队等候,等其他线程执行完毕,再从队列中取出任务继续执行.特点: 线程复用 控制最大并发数 管理线程线程池任务放入阻塞队列好处降低资源消耗. 复用创建好的线程,降低线程创建和销毁的造成的消耗提高响应速度.当任务到达时,任务可以不需要等到线程创建就立刻执行提高线程的可管理型.过多线程会降低系统稳定性,增加资源消耗.使用线程池可以统一分配和调优监控继承结构[外链图原创 2021-01-08 15:37:01 · 101 阅读 · 0 评论 -
10.callable
获取多线程的方法实现Runnable实现Callable实例化Thread使用线程池获取CallableCallable是一种让线程执行完毕之后有返回的接口Callable使用示例public class CallableDemo { public static void main(String[] args) throws ExecutionException, InterruptedException {// futureTaskDemo();原创 2021-01-08 15:32:36 · 72 阅读 · 0 评论 -
9.synchronized和lock的区别
Synchronized和lock的区别synchronized属于JVM层面,属于java的关键字底层使用jvm 字节码指令monitorenter(通过monitor对象来完成,wait/notify方法也依赖monitor对象,只能在同步块或方法中才能使用wait/notify方法)lock属于具体类 juc中的Lock接口的实现类使用方法synchronized: 不需要用户去手动释放,当synchronized代码执行后,系统会自动让线程释放对锁的占用ReentrantLo原创 2021-01-08 15:06:13 · 103 阅读 · 1 评论 -
8.阻塞队列
阻塞队列FIFO队列BlockingQueue[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fEuq0oAW-1610088174926)(C:\Users\denglw\AppData\Roaming\Typora\typora-user-images\image-20201230174526479.png)]线程1往阻塞队列添加元素,线程2从阻塞队列里面取出元素当阻塞队列为空时,从队列中获取元素的线程将被阻塞当阻塞队列满的时候,从队列中添加元素线程将被阻塞原创 2021-01-08 14:43:11 · 90 阅读 · 0 评论 -
7.JUC三大线程工具
JUC三大工具 CountDownLatch CyclicBarrier SemaphoreCountDownLatch让线程阻塞直到另一些线程完成之后才会唤醒CountDownLatch主要有两个方法,当一个或多个线程调用await方法,调用线程会阻塞,等待其他线程调用countDown方法将计数器-1(调用countDown方法的线程不会被阻塞),当计数器值变成零,所有调用await的方法被阻塞线程被唤醒例如公司关门,需要等到所有人走完了之后,最后一个人将门关上,初始化一个CountDownLa原创 2021-01-08 11:45:33 · 121 阅读 · 0 评论 -
6.Collection线程不安全性
Collection线程不安全性ListarrayList线程不安全,底层采用Object[]数组存储new ArrayList 底层创建一个空数据,初始值为10当执行add方法,如果超过10个,会进行扩容处理,扩容为原值大小的一半private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapaci原创 2021-01-08 11:35:41 · 138 阅读 · 0 评论 -
5.读写锁
独占锁 (写锁) / 共享锁 (读锁) /互斥锁独占锁: 该锁一次只能被一个线程锁持有,ReentrantLock和synchronized都是独占锁共享锁: 该锁可以对多个线程锁持有, 典型使用场景是在读锁ReentrantReadWriteLock是读锁共享,写锁独占以前我们在使用ReentrantLock的是独占锁,一次只能有一个线程访问,在一些场景里面读的时候想同时进行,但是写的时候需要独占,这样既提高了并发性,也保证了数据一致性.场景就如同车站大屏显示班次的时候,可以有很多人去读,但是再更原创 2021-01-08 11:24:23 · 90 阅读 · 0 评论 -
4.自旋锁
自旋锁实现package com.corn.juc.lock;import lombok.SneakyThrows;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicReference;/** * @author : Jim Wu * @version 1.0 * @function : * @since : 2020/12/29 15:35 */public class原创 2021-01-08 11:22:59 · 91 阅读 · 0 评论 -
3.ReentrantLock详解
公平锁与非公平锁公平锁多线程按照申请所的顺序来获取锁,FIFO,先进先出队列非公平锁多线程获取锁的顺序,并不是按照申请锁的顺序,有可能后申请的线程比先申请锁的线程优先获取锁,在高并发情况下,有可能造成优先级反转,或者锁饥饿(某线程一直得不到锁),但是可以提高吞吐量创建JUC包中的ReentrantLock创建可以指定构造方法boolean类型来选择使用公平锁还是非公平锁,默认是非公平锁/** * Creates an instance of {@code ReentrantLock}原创 2021-01-08 11:04:32 · 208 阅读 · 0 评论 -
2.CAS原理
CAS原理CAS Compare-And-Swap判断内存中的某一个位置的值是否为预期值,如果是则修改为新的值,过程是原子性的CAS并发原语体现在sun.misc.Unsafe类的各个方法中.调用Unsafe类中的CAS方法,JVM会实现CAS的汇编指令,这是一种完全依赖硬件的功能,通过它实现了原子操作,由于CAS属于系统原语,原语属于操作系统应用范畴,是由若干指令组成,用于完成某一个特定功能,并且原语执行必须是连续的,在执行过程中不允许被中断,CAS是一条CPU的原子指令,不会存在线程安全问题原创 2021-01-05 11:57:16 · 96 阅读 · 0 评论 -
1.volatile详解
volatile是JVM提供的 轻量级 的同步机制保证可见性不保证原子性禁止指令重排Volatile可见性JMM java内存模型Java Memory Model,是一种抽象概念,实际并不存在,他描述的是一组规则或者规范,通过这组规范定义了程序中的各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式JMM关于同步的规定线程解锁前,必须把共享变量的值刷新回主内存线程解锁前,必须读取主内存的最新值到自己的工作内存加锁和解锁是同一把锁JVM运行程序的实体是线程,而.原创 2021-01-05 11:52:14 · 175 阅读 · 0 评论