—— 并发编程 ——
文章平均质量分 85
主要收录多线程、高并发的学习和应用实践
_之桐_
一万年太久,只争朝夕,为博学而专精。
展开
-
JUC并发编程19 | 读写锁
我参考了一些资料,对该 “”数据可见性“” 有了另一种理解,理解是 当前线程为了保证数据的可见性,这是指线程自己更改了数据,自己应该要察觉到数据的变化,如果没有读锁,更改完数据之后线程T获取到了写锁并更改了数据,则当前线程读到的数据是线程T更改的,并不是自己更改的,当前线程并不知道是线程T修改了自己要读的(原来自己改的)数据,所以可能导致当前线程在执行后续代码的时候结果出错,这时就导致了数据的不可见,即当前线程并无法察觉到自己修改的值!并且,当释放锁或者转换锁的时候,都要传入最初获取的stamp值。原创 2023-05-12 12:29:42 · 675 阅读 · 0 评论 -
JUC并发编程18 | AQS分析
尚硅谷(140-155)原创 2023-05-12 12:29:32 · 525 阅读 · 0 评论 -
JUC并发编程17 | synchronized锁升级
谈谈你对 Synchronized 的理解synchronized 的锁升级高并发时,同步调用应该去考量锁的性能损耗。能用无锁数据结构,就不要用锁;能所区块,就不要所整个方法体;能用对象锁,就不要用类锁。尽可能使加锁的代码工作量尽可能小,避免在所代码中调用RPC方法。synchronized 可以实现数据的安全,但是会带来性能的下降。锁升级的过程:无锁、偏向锁、轻量级锁(cas等),重量级锁(synchronized)synchronized锁升级过程总结:一句话,就是先自旋,不行再阻塞。原创 2023-05-12 12:25:18 · 564 阅读 · 0 评论 -
JUC并发编程14 | ThreadLocal
最佳实践ThreadLocal.withInitial(()->初始化值),不设置可能会报空指针异常建议把ThreadLocal修饰为static用完记得手动删除removeThreadLocal并不解决线程间共享数据的问题ThreadLocal适用于变量在线程间隔离且在方法间共享的场景ThreadLocal通过隐式的在不同线程内创建独立实例副本避免了实例线程安全的问题。原创 2023-05-12 12:10:36 · 699 阅读 · 0 评论 -
JUC并发编程16 | CAS自旋锁
是什么,干什么,解决了什么痛点?如何解决,如何使用。原子类:java.util.concurrent.atomic在没有CAS之前,多线程环境不使用原子类保证线程安全i++等操作,会出现数据问题,如果直接加锁synchronized,资源的开销就比较大在出现CAS之后,多线程环境,使用原子类保证线程安全i++,类似我们的乐观锁。原创 2023-05-12 12:17:27 · 1002 阅读 · 0 评论 -
JUC并发编程15 | Java内存模型JMM与volatile
编译器未有优化程序性能而对指令序列进行重排序的一种手段,有时候会改变程序的语句的先后顺序。原创 2023-05-12 12:16:24 · 744 阅读 · 0 评论 -
【尚硅谷】大厂必备技术之JUC并发编程——笔记总结
【JUC并发编程01】JUC概述关键字:进程和线程、进程和线程、wait和sleep、并发与并行、管程、用户线程和守护线程【JUC并发编程02】Lock接口关键字:synchronized、Lock接口、创建线程的多种方式(4种)、使用Lock实现卖票例子、synchronized和Lock两者差异【JUC并发编程03】线程间通信关键字:synchronized 实现案例、虚假唤醒问题、Lock 实现案例【JUC并发编程04】线程间定制化通信(单标志法存在的问题)关键字:线程间定制化通信原创 2022-02-20 13:36:18 · 6858 阅读 · 3 评论 -
【JUC并发编程13】异步回调
文章目录13 异步回调13.1 CompletableFuture13.2 Future 与 CompletableFuture13 异步回调同步:指等待资源(阻塞)异步:指设立哨兵,资源空闲通知线程,否则该线程去做其他事情(非阻塞)13.1 CompletableFutureCompletableFuture 在 Java 里面被用于异步编程,异步通常意味着非阻塞,可以使得我们的任务单独运行在与主线程分离的其他线程中,并且通过回调可以在主线程中得到异步任务的执行状态,是否完成,和是否异常等信息原创 2022-02-08 13:56:07 · 1213 阅读 · 1 评论 -
【JUC并发编程12】Fork与Join分支
12 Fork 与 Join分支将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果。该算法相当于递归,且是二分查找思路class Fibonacci extends RecursiveTask<Integer> { final int n; Fibonacci(int n) { this.n = n; } Integer compute() { if (n <= 1) return n; Fibona原创 2022-02-08 13:55:33 · 999 阅读 · 1 评论 -
【JUC并发编程11】线程池
文章目录线程池11.1 线程池概述11.2 线程池架构11.3 线程池使用方式11.4 线程池底层原则11.5 线程池的七个参数11.6 线程池底层工作流程11.7 自定义线程池线程池11.1 线程池概述连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用线程池(英语:thread pool)一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。原创 2022-02-07 11:19:06 · 1566 阅读 · 1 评论 -
【JUC并发编程10】阻塞队列
文章目录10 阻塞队列10.1 阻塞队列概述10.2 阻塞队列架构10.3 阻塞队列分类10.4 阻塞队列核心方法10 阻塞队列10.1 阻塞队列概述阻塞队列是共享队列(多线程操作),一端输入,一端输出,不能无限放队列,满了之后就会进入阻塞,取出也同理当队列是空的,从队列中获取元素的操作将会被阻塞当队列是满的,从队列中添加元素的操作将会被阻塞试图从空的队列中获取元素的线程将会被阻塞,直到其他线程往空的队列插入新的元素试图向已满的队列中添加新元素的线程将会被阻塞,直到其他线程从队列中移除一个原创 2022-02-07 11:17:24 · 822 阅读 · 1 评论 -
【JUC并发编程09】读写锁
文章目录9 读写锁9.1 悲观锁和乐观锁9.2 表锁|行锁|读锁|写锁9.3 读写锁概述9.4 读写锁的演变9.5 锁降级的必要性9 读写锁9.1 悲观锁和乐观锁悲观锁:顾名思义,它是干什么都很悲观,所以在操作的时候,每次都先上锁,使用时解锁乐观锁:它很乐观,多线程,并不上锁,但是会发生线程安全问题,通过比较版本号来同步9.2 表锁|行锁|读锁|写锁表锁:整个表操作,不会发生死锁行锁:每个表中的单独一行进行加锁,会发生死锁读锁:共享锁(可以有多个人读),会发生死锁写锁:独占锁(只能有一个原创 2022-02-05 20:25:53 · 1377 阅读 · 1 评论 -
【JUC并发编程08】JUC强大辅助类
文章目录8 JUC强大辅助类8.1 减少计数CountDownLatch8.2 循环栅栏 CyclicBarrier8.3 信号灯 Semaphore8 JUC强大辅助类该辅助类主要讲述三个减少计数 CountDownLatch循环栅栏 CyclicBarrier信号灯 Semaphore8.1 减少计数CountDownLatch该类的构造方法为 CountDownLatch(int count) 构造一个用给定计数初始化的 CountDownLatch 在这里插入代码片p原创 2022-02-05 20:16:22 · 1145 阅读 · 1 评论 -
【JUC并发编程07】Callable接口
文章目录7 Callable接口7.1 Callable接口创建线程7.2 FutureTask7 Callable接口创建线程的多种方式:继承Thread类实现Runnable接口Callable接口线程池7.1 Callable接口创建线程目前学习了有两种创建线程的方法,一种是通过创建 Thread 类,另一种是通过使用 Runnable 创建线程,但是,Runnable 缺少的一项功能是,当线程终止时(即 run()完成时),我们无法使线程返回结果。为了支持此功能,Java 中提供原创 2022-02-02 15:59:45 · 1758 阅读 · 1 评论 -
【JUC并发编程06】多线程锁 (公平锁和非公平锁,死锁,可重锁)
文章目录6 多线程锁 (公平锁和非公平锁,死锁,可重锁)6.1 synchronized 锁的八种情况6.2 对上述例子的总结6.3 公平锁和非公平锁6.4 可重入锁6.5 死锁6 多线程锁 (公平锁和非公平锁,死锁,可重锁)某一个时刻内,只能有唯一一个线程去访问这些synchronized 方法所有的 静态同步方法用的也是同一把锁 ——类对象本身,这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞态条件的,但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放原创 2022-02-02 15:58:47 · 1208 阅读 · 1 评论 -
【JUC并发编程05】集合的线程安全
文章目录5 集合的线程安全5.1 集合线程不安全演示5.2 解决方案-Vector5.3 解决方案-Collections5.4 解决方案-CopyOnWriteArrayList5.5 对上述三种方式的总结5.6 HashSet的线程不安全5.7 HashMap的线程不安全5 集合的线程安全5.1 集合线程不安全演示在学习集合线程安全之前,先来看一下为什么在多线程中会出现不安全。以 ArrayList 为例,我们进入 ArrayList 源码,找到 add() 方法,源码如下public boo原创 2022-01-31 16:48:42 · 3328 阅读 · 1 评论 -
【JUC并发编程04】线程间定制化通信(单标志法存在的问题)
文章目录4 线程间定制化通信案例实现该案例需要注意4 线程间定制化通信案例实现案列:启动三个线程,按照如下要求:AA打印5此,BB打印10次,CC打印15次,一共进行10轮具体思路:每个线程添加一个标志位,是该标志位则执行操作,并且修改为下一个标志位,通知下一个标志 位的线程创建一个可重入锁 private Lock lock = new ReentrantLock();分别创建三个开锁通知 private Condition c1 = lock.newCondition();(他们能原创 2022-01-31 16:47:44 · 1662 阅读 · 0 评论 -
【JUC并发编程03】线程间通信
文章目录3 线程间通信3.1 synchronized 实现案例3.2 虚假唤醒问题3.3 Lock 实现案例3 线程间通信线程间通信有两种实现方法:关键字 synchronized 与 wait()/notify() 这两个方法一起使用可以实现等待/通知模式Lock 接口中的 newContition() 方法返回 Condition 对象,Condition 类也可以实现等待/通知模式用 notify()通知时,JVM 会随机唤醒某个等待的线程使用 Condition 类可以进行选择性通知原创 2022-01-27 20:00:34 · 1879 阅读 · 1 评论 -
【JUC并发编程02】Lock接口
文章目录2 Lock接口2.1 复习synchronizedsynchronized的作用范围使用synchronized实现卖票例子2.2 什么是Lock接口Lock 接口介绍Lock 实现可重入锁2.3 创建线程的多种方式继承Thread类实现Runnable接口使用Callable接口使用线程池2.4 使用Lock实现卖票例子2.5 synchronized和Lock两者差异2 Lock接口2.1 复习synchronizedsynchronized的作用范围synchronized是Java原创 2022-01-27 16:40:29 · 2117 阅读 · 1 评论 -
【JUC并发编程01】JUC概述
文章目录1 进程与线程的概念1.1 进程和线程1.2 线程的状态1.3 wait和sleep1.4 并发与并行1.5 管程1.6 用户线程和守护线程1 进程与线程的概念1.1 进程和线程进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。线程(英语:thread原创 2022-01-25 18:28:54 · 2667 阅读 · 1 评论