
JUC并发编程
文章平均质量分 90
Java的JUC并发编程是个很重要的知识点,且在现实开发的场景中运用的特别多
Daylan Du
软件工程专业,主要研究JAVA后端。对数据库,操作系统,spring系列框架等有一定的了解。努力学习编程知识,争取不搬砖!
展开
-
JUC并发编程(超详细)
彻底理解JUC并发编程,详细罗列了于JUC挂钩的核心知识,直击面试。随着对Java的深入学习,越发觉得JVM和JUC这些底层原理的重要性,在看完黑马程序员的JVM后,也对JUC产生了浓厚的兴趣。在学习JUC的过程中,通过老师的视频做笔记,在遇到一些不懂的或者想更深入了解的知识时,自己也去搜索了很多资料,再把老师的笔记整理一下。下面是我做的JUC的笔记目录,欢迎大家一起讨论学习。...............原创 2022-08-03 09:02:00 · 2063 阅读 · 1 评论 -
JUC-18. 常用的辅助类
本文章介绍了在并发情境下,常用的三个辅助类:CountDownLatch(内存栅栏),CyclicBarrier(循环屏障),Semaphore(信号量),并通过三个案例,详细讲接三个辅助类的用法与特点原创 2022-08-03 08:52:43 · 678 阅读 · 0 评论 -
JUC-17. ReadWriteLock
ReadWriteLock也是一个接口,提供了readLock和writeLock两种锁的操作机制读写锁与排他锁(独占锁)不同的是,读写锁在同一时刻可以允许多个读线程方法,但是在写线程访问时,所有的读线程和其它写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排它锁有了很大的提升。读锁:readLock是共享锁,写锁:writeLock是独占锁。读写互斥,读读共享,写写互斥。好处:读写分离锁可以有效地帮助减少锁竞争, 提升系统性能。.........原创 2022-08-03 08:49:27 · 620 阅读 · 0 评论 -
JUC-16. CAS
CAS的全称为(比较并交换),它是一条CPU并发原语,比较工作内存值(预期值)和主物理内存的共享值是否相同,相同则执行规定操作,否则继续比较直到主内存和工作内存的值一致为止。这个过程是原子的AtomicInteger类主要利用CASvolatile和native方法来保证原子操作,从而避免synchronized的高开销,执行效率大为提升。CAS并发原语体现在Java语言中,就是sun.misc包下的UnSafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会帮我实现 CAS汇编指令。......原创 2022-08-03 08:44:59 · 817 阅读 · 0 评论 -
JUC-15. 原子类(Atomic)
Atomic翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子/原子操作特征的类。本章通过AtomicInteger、AtomicIntegerArray、AtomicReference等案例讲解原子类的使用方式.........原创 2022-08-03 08:42:19 · 848 阅读 · 0 评论 -
JUC-14. Volatile
volatile关键字是由JVM提供的最轻量级同步机制,被volatile修饰的变量有三个特点可见性、有序性、不保证原子性内存屏障(也称内存栅栏,是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作),避免代码重排序。内存屏障其实就是一种JVM指令,Java内存模型的重排规则会要求Java编译器在生成JVM指令时插入特定的内存屏障指令,通过这些内存屏障指令,volatile实现了Java内存模型中的可见性和有序性,....原创 2022-08-03 08:38:23 · 812 阅读 · 0 评论 -
JUC-13. JMM
JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过规范定制了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。计算机在执行程序时,为了提高性能,编译器和处理器常常会做指令重排,一般分为以下3种。单线程坏境里面确保程序最终执行结果和代码顺序执行的结果一致。关键技术点都是围绕多线程的。线程解锁前,必须把共享变量。中的最新值到工作内存中。关于JMM的相关约定。unlock(解锁)assign(赋值)...原创 2022-08-03 08:34:05 · 623 阅读 · 0 评论 -
JUC-12. Stream流式计算
- Stream是操作集合的一种计算数据的工具,集合就是数据,Stream是计算集合中的数据的工具- 集合操作非常麻烦,若要对集合进行筛选、投影,需要写大量的代码,而流是以声明的形式操作集合,它就像SQL语句,我们只需告诉流需要对集合进行什么操作,它就会自动进行操作,并将执行结果交给你,无需我们自己手写代码。- 因此,流的集合操作对我们来说是透明的,我们只需向流下达命令,它就会自动把我们想要的结果给我们。由于操作过程完全由Java处理,因此它可以根据当前硬件环境选择最优的方法处理,我们也无需编写复杂又容原创 2022-08-03 08:32:19 · 591 阅读 · 0 评论 -
JUC-11. 四种函数式接口
在Java8支持Lambda表达式以后,为了满足Lambda表达式的一些典型使用场景,JDK为我们提供了大量常用的函数式接口。它们主要在包中。Function:功能型函数接口Predicate:断言型接口Suppier:供给型接口Consumer:消费型接口。.........原创 2022-08-02 22:16:33 · 714 阅读 · 0 评论 -
JUC-10. CompletableFuture
CompletableFuture类实现了Future和CompletionStage接口CompletionStage代表异步计算过程中的某一个阶段,一个阶段完成后可能会触发另外一个阶段一个阶段的计算执行可以是一个Funcation、Consumer、Runnable原创 2022-08-02 22:08:32 · 619 阅读 · 0 评论 -
JUC-9. Fork/Join分支合并框架
Fork/Join分治算法原创 2022-08-02 22:04:50 · 396 阅读 · 0 评论 -
JUC-8. 锁(二)
该文章详细介绍了乐观锁与悲观锁、公平锁与非公平锁、可重入锁,死锁以及死锁的排查。死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁..........原创 2022-08-02 22:03:41 · 655 阅读 · 0 评论 -
JUC-7. 线程池
线程池做的工作主要是:控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。线程复用,控制最大并发数,管理线程。线程池的优势:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度:当任务到达时,任务可以不需要等待线程创建就能立即执行。提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性。.........原创 2022-08-02 21:47:21 · 640 阅读 · 0 评论 -
JUC-6. 阻塞队列
阻塞队列是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素JDK7提供了7个阻塞队列。分别是一个由数组结构组成的有界阻塞队列。一个由链表结构组成的有界阻塞队列。一个支持优先级排序的无界阻塞队列。一个使用优先级队列实现的无界阻塞队列。.........原创 2022-08-02 20:45:22 · 707 阅读 · 0 评论 -
JUC-5. 锁(一)
1.本文章详细讲接了Lock锁和synchronized锁的异同演示2.通过生产者消费者的案例,进一步深入理解Lock锁和synchronized锁,以及condition的优势3.通过八锁现象,彻底理解锁的对象(class?对象?)原创 2022-08-02 20:42:47 · 654 阅读 · 0 评论 -
JUC-4. 集合线程安全
ConcurrentHashMap的get操作跟HashMap类似,只是ConcurrentHashMap第一次需要经过一次hash定位到Segment的位置,然后再hash定位到指定的HashEntry,遍历该HashEntry下的链表进行对比,成功就返回,不成功就返回null。,在一些场景中(并发不激烈的情况下)它比Synchronized和ReentrentLock的效率要高,当CAS保障不了线程安全的情况下(扩容或者hash冲突的情况下)转成Synchronized 来保证线程安全,大大。.....原创 2022-08-02 20:38:45 · 907 阅读 · 0 评论 -
JUC-3. Java多线程
1.文章讲解了创建线程的四种方式,着重讲解了通过Callable创建线程的原理及步骤。2.文章介绍了几种查看进程线程运行的方法和线程运行的原理3.关于线程的API,详细讲接了sleep、yield、wait三个方法的异同............原创 2022-08-02 20:29:45 · 819 阅读 · 0 评论 -
JUC-2. 进程和线程
程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行并发就是一个CPU在同一时间段去不同线程中执行指令并行就是多个CPU同一时间处理不同的线程..................原创 2022-08-02 20:21:03 · 592 阅读 · 0 评论 -
JUC并发编程中的阻塞队列
阻塞队列是一个支持两个附加操作的队列。这两个附加的操作是在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素JDK7提供了7个阻塞队列。分别是一个由数组结构组成的有界阻塞队列。一个由链表结构组成的有界阻塞队列。一个支持优先级排序的无界阻塞队列。一个使用优先级队列实现的无界阻塞队列。。...原创 2022-07-31 19:07:10 · 660 阅读 · 0 评论 -
函数式接口详解
函数式接口是每个程序员都必须掌握的知识,结合lambda表达式,不仅让我们的代码更加简洁且具有可读性,也能让我们代码实现更加多样。在Java8支持Lambda表达式以后,为了满足Lambda表达式的一些典型使用场景,JDK为我们提供了大量常用的函数式接口。它们主要在 java.util.function 包中。函数式接口主要分为四种类型:Function(功能性函数接口)、Predicate(断言型接口)、Supplier(供给型接口)、Consumer(消费性接口)。......原创 2022-07-31 19:02:01 · 509 阅读 · 0 评论 -
线程池的三个方法、七个参数、四种拒绝策略
线程池做的工作主要是:控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。线程池的重要知识可以总结为三个方法,七大参数,四种拒绝策略...原创 2022-07-28 15:18:26 · 1559 阅读 · 0 评论 -
JUC并发编程的三个常用工具类使用
JUC并发包下有四个并发工具类,闭锁CountDownlatch、栅栏CyclicBarrier、信号量Semaphore、交换器Exchanger。 本篇文章我们对前三个辅助类进行讲解。CyclicBarrier有两个构造器CyclicBarrier(int parties) :创建一个CyclicBarrier对象,并指定其partiesCyclicBarrier(int parties, Runnable barrierAction) :指定parties,并且执行其callBack(在所有线程都到原创 2022-07-28 12:01:02 · 1093 阅读 · 0 评论