JUC
文章平均质量分 94
JUC
起名方面没有灵感
前世大厂架构师、上市公司ceo,被小人陷害,重生为24年应届毕业生,点个关注,看我如何逆风翻盘。
展开
-
【JUC】一文弄懂@Async的使用与原理
在Spring3.X的版本之后,内置了@Async解决了多个任务同步进行导致接口响应迟缓的情况。使用@Async注解可以异步执行一个任务,这个任务的返回值必定为null,所以在使用@Async推荐返回值为NULL。那么该如何使用@Async开启一个异步任务呢?:启动类上开启异步模式@Async:需要异步处理的方法@Service@Async需要注意的是,@Async的异步任务是基于AOP实现的,如果是自调用的情况下,@Async是不会生效的喔。原创 2023-09-30 12:12:25 · 2390 阅读 · 1 评论 -
【JUC进阶】详解synchronized锁升级
是一个悲观锁,可以实现线程同步,在多线程的环境下,需在操作同步资源的时候先加锁,避免共享资源出现问题。因为加锁可以使得一个线程在一个时间点内只有一个线程可以访问,这样增加了安全性。但是这样却损失了程序的执行性能,因为在加锁、抢夺锁、释放锁需要从用户态切换成内核态,属于操作系统层面的,因此比较消耗性能。无锁状态偏向锁状态轻量级锁状态重量级锁状态。这几个状态会随着竞争情况逐渐升级。可以用在实例方法、静态方法、代码块上修饰实例方法,对当前实例对象this加锁修饰静态方法,对当前类的Class对象加锁。原创 2023-04-12 12:44:46 · 510 阅读 · 1 评论 -
【JUC进阶】从源码角度万字总结ReentrantLock与AQS
是一个互斥锁,能够实现共享数据做互斥同步,这样在同一个时刻保证了只有一个线程能执行某个方法或者是某个代码块。同时,也是一个可重入锁,能够保证一个线程能够对临界共享资源进行重复加锁。对于互斥锁,JDK中还提供了一种实现,两种锁的区别如下锁实现机制对象头监视器模式依赖 AQS灵活性不灵活支持响应中断、超时、尝试获取锁释放锁形式自动释放锁显示调用 unlock()支持锁类型非公平锁公平锁 & 非公平锁条件队列单条件队列多个条件队列是否支持可重入支持支持可见,是要比。原创 2023-03-22 11:27:27 · 530 阅读 · 0 评论 -
【JUC进阶】一文深度讲解CAS
在JDK5之前,可以通过synchronized或Lock来保证高并发的业务场景下的线程安全,但是synchronized或Lock都属于互斥锁的方案,互斥锁所带来的比较重量级、加锁、释放锁都会带来性能上的损耗。于是,就出现了CAS机制实现无锁的解决方案,CAS和乐观锁类似,CAS可以达到非阻塞同步的方式来保证线程安全。CAS是现代CPU广泛支持的一种对内存中共享数据进行操作的一种特殊指令这个指令可以对内存中的共享数据做原子的读写操作。原创 2023-03-20 05:00:00 · 600 阅读 · 0 评论 -
【JUC进阶】如何优雅地处理线程池异常?
在开发中,我们经常使用线程池,会将不同的任务提交到线程池中,但是如果任务出现了异常,会发生什么呢?怎么获取到异常信息来解决异常?提交任务时,即使任务出现异常也不会打印异常信息,这是不友好的,这样开发者就不知道程序是否有异常。是一个处理线程内发生的异常的方法,参数为线程对象t和异常对象e。方法中,如果出现了异常,不会将异常往外抛,则是将异常设置给。里面把异常吞了,根本不会跑出来异常,因此也不会有异常进入到。提交的异常的时候,需要进行额外的处理,也就是判断。方法里面,将异常吞掉了,并没有抛出异常,因此在。原创 2023-03-19 16:17:50 · 1080 阅读 · 1 评论 -
【JUC进阶】如何合理设置线程池核心线程数?
线程池(Thread Pool)是一种基于池化思想管理线程的工具,线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。因此,线程池的参数的合理化就会显得很重要了。如果核心线程数设置偏小,那么会大量抛出,触发接口降级条件。原创 2023-03-18 20:57:04 · 1812 阅读 · 0 评论 -
【JUC】12.读写锁与StampedLock[完结]
读写锁是指ReentrantReadWriteLock类该类能被多个读线程访问或者一个写线程访问,但是不能同时存在读写线程其特点主要是:一体两面、读写互斥、读读共享有线程在写的时候,其他线程不能读;有线程在读的时候,其他线程不能写StampedLock优化的主要是ReentrantReadWriteLock出现的锁饥饿问题stamp代表的是锁的状态。当stamp返回零时,表示线程获取锁失败。并且,当释放锁或者转换锁的时候,都要传入最初获取的stamp值回顾锁饥饿问题。原创 2022-10-26 05:00:00 · 342 阅读 · 0 评论 -
【JUC】11.AQS
类AQS是用来实现锁或者其他同步器组件的公共基本部分的抽象实现,是重量级基础框架及整个JUC体系的基石,主要用于解决锁分配给“谁”的问题整体就是一个抽象的FIFO队列来完成资源获取线程的排队工作,原创 2022-10-24 22:27:03 · 564 阅读 · 1 评论 -
【JUC】10. synchronized与锁升级
synchronized锁升级过程总结:一句话,就是先自旋,不行再阻塞。实际上是把之前的悲观锁(重量级锁)变成在一定条件下使用偏向锁以及使用轻量级(自旋锁CAS)的形式synchronized在修饰方法和代码块在字节码上实现方式有很大差异,但是内部实现还是基于对象头的MarkWord来实现的。JDK1.6之前synchronized使用的是重量级锁,JDK1.6之后进行了优化,拥有了无锁->偏向锁->轻量级锁->重量级锁的升级过程,而不是无论什么情况都使用重量级锁。原创 2022-10-23 22:38:31 · 721 阅读 · 0 评论 -
【JUC】9.对象内存布局
对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)(保证8个字节的倍数)。而对象头又分为以下三种对象标记Mark Word类元信息(存储的是指向该对象类元数据的首地址)(又称类型指针)长度(这个只有数组有)面试题Object object=newObject()谈谈你对这句话的理解?new出的对象位置所在:先在JVM里的堆->新生区->伊甸园区构成布局为对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)原创 2022-10-21 04:30:00 · 258 阅读 · 0 评论 -
【JUC】8.ThreadLocal
ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事务ID)与线程关联起来。那么ThreadLocal能干嘛呢?原创 2022-10-20 05:30:00 · 465 阅读 · 1 评论 -
【JUC】7.原子类
原子类是指java.util.concurrent.atomic下的类其中这十六个类可以分为以下基本类型原子类数据类型原子类引用类型原子类对象的属性修改原子类原子操作增强类。原创 2022-10-19 13:16:51 · 415 阅读 · 0 评论 -
【JUC】6.CAS
CAS是compare and swap的缩写,中文翻译成比较并交换,实现并发算法时常用的一种技术它包含三个操作数——内存位置、预期原值及更新值执行CAS操作的时候,将内存位置的值与预期原值比较如果相匹配,那么处理器会自动将该位置值更新为新值如果不匹配,处理器不做任何操作,多线程同时执行CAS操作只有一个会成功位置内存值V,旧的预期值A,要修改的更新值B当且仅当旧的预期值A与内存值V相同时,将内存V修改为B,否则什么都不做或者重来当它重来重试的这种行为称为——自旋。原创 2022-10-14 18:08:50 · 404 阅读 · 1 评论 -
【JUC】5.volatile关键字
**被volatile修饰的变量有两大特点**- 可见性- 有序性:加了volatile说明这变量有排序要求,有时候需要禁重排(存在数据依赖的时候禁重排)而JMM规范下有三大特性- 可见性- 有序性- 原子性**对比可以看出,volatile不支持原子性**> **volatile的内存语义**>> - 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中> - 当读一个volatile变量时,JMM会把该线程对应本地内存设置为无效,原创 2022-10-11 17:34:00 · 352 阅读 · 0 评论 -
【JUC】4.Java内存模型之JMM
JMM就是Java内存模型(java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问有一定的差异,所以会造成相同的代码运行在不同的系统上会出现各种问题。所以java内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到一致的并发效果。Java内存模型规定所有的变量都存储在主内存中,包括实例变量,静态变量,但是不包括局部变量和方法参数。每个线程都有自己的工作内存,原创 2022-10-10 18:34:04 · 267 阅读 · 0 评论 -
【JUC】3.中断机制
首先,一个线程不应该由其他线程来强制中断或停止,应该是由线程自己自行停止的,自己来决定自己命运才合理其次,Java没办法立刻停止一条线程,所以停止线程显得尤为重要,如取消一个耗时操作因此,Java提供了一种用于停止线程的协商机制——中断,也称中断标识协商机制中断只是一种协作协商机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现若要中断一个线程,需要手动调用该线程的interrupt方法,该方法也仅仅是将线程对象的中断标识设置为true。原创 2022-10-09 10:28:17 · 170 阅读 · 0 评论 -
【JUC】2.多线程锁
死锁只是两个或两个以上的线程在执行过程中,因争夺资源而造成的一种相互等待的现象;若无外力干涉那么他们无法推进下去,如果系统资源充足,进程资源请求都得到满足,死锁出现的可能性就会很低,否则就会因争夺有限资源而陷入死锁。原创 2022-10-02 00:09:27 · 551 阅读 · 0 评论 -
【JUC】1.CompletableFuture异步编程
CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调、流式处理、多个Future组合处理的能力,使Java在处理多任务的协同工作时更加顺畅便利。原创 2022-10-01 16:44:52 · 564 阅读 · 0 评论