![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 86
施小赞
人生苦短,我爱Java
展开
-
14、课程总结与回顾
这基本上接近本课程终点了,O(∩_∩)O 请同学们务必动手学会+跳槽时动嘴可说, 你所谓的懂了可能只是理解了,一动手一动嘴估计可能挂了,请下苦功夫打磨自己 最后的梳理走走...... 1、CompletableFuture2、“锁”事儿 2.1、悲观锁 2.2、乐观锁 2.3、自旋锁 2.4、可重入锁(递归锁) 2.5、写锁(独占锁)/读锁(共享锁) 2.6、公平锁/非公平锁 2.7、死锁原创 2022-06-10 10:34:13 · 317 阅读 · 0 评论 -
13、ReentrantLock、ReentrantReadWriteLock、StampedLock讲解
无锁→独占锁→读写锁→邮戳锁你知道Java里面有哪些锁?你说你用过读写锁,锁饥饿问题是什么?有没有比读写锁更快的锁?StampedLock知道吗?(邮戳锁/票据锁)ReentrantReadWriteLock有锁降级机制策略你知道吗?读写锁定义为一个资源能够被 多个读线程 访问,或者被 一个写线程 访问,但是不能同时存在读写线程。 『读写锁』意义和特点『 读写锁 ReentrantReadWriteLock 』 并不是 真正意义上的读写分离, 它只允许读读共存,而读写和写写依然是互斥的, 大多实际场景是 “原创 2022-06-10 10:31:40 · 552 阅读 · 1 评论 -
12、AbstractQueuedSynchronizer之AQS
公平锁和非公平锁可重入锁自旋锁LockSupport数据结构之链表设计模式之模板设计模式抽象的队列同步器源代码 AbstractOwnableSynchronizer AbstractQueuedLongSynchronizer AbstractQueuedSynchronizer 通常地:AbstractQueuedSynchronizer简称为AQS 是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石,通过内置的FIFO队列来完成资源获取线程的排队工原创 2022-06-10 10:21:24 · 445 阅读 · 0 评论 -
11、Synchronized与锁升级
谈谈你对Synchronized的理解Synchronized的锁升级你聊聊Synchronized的性能是不是一定弱于Lock synchronized 锁优化的背景 用锁能够实现数据的 安全性 ,但是会带来 性能下降 。 无锁能够基于线程并行提升程序性能,但是会带来 安全性下降 。 求平衡??? synchronized锁:由对象头中的Mark Word根据锁标志位的不同而被复用及锁升级策略重量级锁,假如锁的竞争比较激烈的话,性能下降Java5之前,用户态和内核态之间的切换 java的线程是原创 2022-06-10 09:46:19 · 758 阅读 · 0 评论 -
10、Java对象内存布局和对象头
一般而言JDK8按照默认情况下,new一个对象占多少内存空间位置所在:JVM里堆→新生区→伊甸园区构成布局:头体?想想我们的HTML报文周志明老师JVM第3版 对象标记Mark Word它保存什么 在 64 位系统中, Mark Word 占了 8 个字节,类型指针占了 8 个字节,一共是 16 个字节 默认存储对象的HashCode、分代年龄和锁标志位等信息。这些信息都是与对象自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。它会根据对象的状态原创 2022-06-09 17:45:25 · 310 阅读 · 0 评论 -
9、聊聊ThreadLocal
ThreadLocal中ThreadLocalMap的数据结构和关系?ThreadLocal的key是弱引用,这是为什么?ThreadLocal内存泄露问题你知道吗?ThreadLocal中最后为什么要加remove方法?...... 稍微翻译一下: ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法) 都有自己的、独立初始化的变量副本 。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态原创 2022-06-09 17:35:27 · 608 阅读 · 0 评论 -
8、原子操作类之18罗汉增强
LongAdder为什么这么快原创 2022-06-09 17:22:56 · 310 阅读 · 0 评论 -
7、CAS
多线程环境不使用原子类保证线程安全(基本数据类型)多线程环境 使用原子类保证线程安全(基本数据类型)CAS compare and swap的缩写,中文翻译成 比较并交换, 实现并发算法时常用到的一种技术。它包含三个操作数—— 内存位置、预期原值及更新值。 执行CAS操作的时候,将内存位置的值与预期原值比较: 如果 相匹配 ,那么处理器会自动将该位置值更新为新值, 如果 不匹配 ,处理器不做任何操作,多个线程同时执行CAS操作 只有一个会成功 。 原理:CAS (CompareAndS原创 2022-06-09 15:29:44 · 387 阅读 · 0 评论 -
6、volatile与Java内存模型
1、被volatile修改的变量有2大特点1.1、特点可见性有序性 排序要求1.2、volatile的内存语义当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中。当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量所以volatile的写内存语义是直接刷新到主内存中,读的内存语义是直接从主内存中读取。2、内存屏障2.1、先说生活case没有管控,顺序难保设定规则,禁止乱序 :上海南京路步行街武警“人墙”当红灯2.2原创 2022-06-09 14:59:42 · 474 阅读 · 0 评论 -
5、Java内存模型之JMM
计算机存储结构,从本地磁盘到主存到 CPU 缓存,也就是从硬盘到内存,到 CPU 。一般对应的程序的操作就是从数据库查数据到内存然后到 CPU 进行计算 问题?和推导出我们需要知道JMM因为有这么多级的缓存(cpu和物理主内存的速度不一致的),CPU的运行并 不是直接操作内存而是先把内存里边的数据读到缓存 ,而内存的读和写操作的时候就会造成不一致的问题Java虚拟机规范中试图定义一种Java内存模型(java Memory Model,简称JMM) 来屏蔽掉各种硬件和操作系统的内存访问差异, 以实现让Jav原创 2022-06-09 14:45:01 · 270 阅读 · 0 评论 -
4、LockSupport与线程中断
如何停止、中断一个运行中的线程?首先一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。其次在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的 interrupt 方法,原创 2022-06-09 10:59:46 · 324 阅读 · 0 评论 -
3、Java“锁”事
认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。 synchronized 关键字和 Lock 的实现类都是悲观锁 适合写操作多的场景,先加锁可以保证写操作时数据正确。显式的锁定之后再操作同步资源2.3、乐观锁乐观锁认为自己在使用数据时 不会有别的线程修改数据 ,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。 如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同原创 2022-06-09 10:43:47 · 389 阅读 · 0 评论 -
2、CompletableFuture
Future接口定义了操作 异步任务执行一些方法 ,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。Callable接口中定义了需要有返回的任务需要实现的方法。 比如主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开始执行任务后,主线程就去做其他事情了,过了一会才去获取子任务的执行结果。 ① 应对Future的完成时间,完成了可以告诉我,也就是我们的回调通知② 将两个异步计算合成一个异步计算,这两个异步计算互相独立,同时第二个又依赖第一个的原创 2022-06-09 10:31:37 · 1080 阅读 · 0 评论 -
1、线程基础知识
线程 操作 资源类摩尔定律:它是由英特尔创始人之一Gordon Moore(戈登·摩尔)提出来的。其内容为:当价格不变时,集成电路上可容纳的元器件的数目约每隔18-24个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。这一定律揭示了信息技术进步的速度。可是从2003年开始CPU主频已经不再翻倍,而是采用多核而不是更快的主频。摩尔定律失效。在主频不再提高且核数在不断增加的情况下,要想让程序更快就要用到 并行或并发编程。高并发系统,异步+回调等生产需求pri原创 2022-06-09 09:53:41 · 672 阅读 · 2 评论 -
AQS源码解读
AQS 源码直接解读比较困难,这里从示例代码入手模拟 A、B、C 三个人都要去银行窗口办理业务,但是银行窗口只有一个,一次只有一个人可以办理业务,办理业务的人会上锁,防止其他人争抢,我们使用 lock.lock() 模拟这种情况/** * @author by shizan * @Classname AQSDemo * @Description TODO * @Date 2021/11/26 4:11 下午 */public class AQSDemo { public st原创 2021-12-02 16:47:08 · 701 阅读 · 5 评论