JUC
文章平均质量分 73
JUC
c1z
这个作者很懒,什么都没留下…
展开
-
Redis内存管理
为什么要设定过期时间内存是有限的,如果所有的对象都不设定过期时间,则很快Redis的内存就会不足。在某些业务场景下需要使用到过期时间,例如验证码有效期等操作Redis如何判断是否到达有效期Redis中维护了过期字典,存储在redisDb这个结构中。过期字典的Key指向了redis的keyvalue指向了该key所对应的过期时间,是毫秒级的时间戳过期数据的删除策略惰性删除仅在用户查询时进行判断key所对应的过期时间是否达到,如果已经达到过期时间则返回空定期删除在原创 2023-10-08 11:01:03 · 23 阅读 · 0 评论 -
ReentrantLock
来清除中断标记,否则在自旋获取锁的过程中,如果该线程在 tryAcquire()中。每一个条件变量对应着一个ConditionObject,内部维护着一个双向队列。**自旋+CAS****真正的首节点**挂起时,会因为该线程。**持有锁的线程****锁的重入次数****cpu时间片****被唤醒的元素**原创 2023-10-07 21:44:44 · 22 阅读 · 1 评论 -
Wait、Notify和Park、Unpark
Wait、Notify需要在同步代码块中,获取到对象锁才能够进行调用调用Notify后,需要执行完后续的代码,从同步代码块中出去才会释放锁notify不能指定唤醒某一个线程wait需要被try catch包围,来保证被唤醒时能够正常执行notify必须在wait之后,如果先进行notify后进行wait,会无效Park和Unpark不需要在同步代码块中,可以不需要获取对象锁也可以进行 LockSupport.park()调用当调用unpark后,指定的线程会直接唤醒unpark可原创 2023-10-07 21:44:08 · 34 阅读 · 1 评论 -
AQS同步器
AbstractQueuedSynchronizer是用于构建同步锁的框架,其中维护了一个,和一个**FIFO**队列**CLH**,AQS为**state**提供了**CAS**操作的方法。保证了变量**state**在多线程环境下的**可见性**,在时为没有线程占有锁,当某个线程使用CAS操作将state改为1后,则说明该线程抢占到了锁。此时其他没有抢占到锁的线程则需要进入到CLH队列中**等待**,并且这些线程会被操作挂起,当占有锁的线程释放锁资源后,会唤醒队列中的线程进行争抢。原创 2023-10-07 21:26:13 · 23 阅读 · 1 评论 -
Synchronized
当线程通过Synchronized获取到锁后,可以继续调用其他的相同对象锁的Synchronized代码块可以避免死锁因为在锁的竞争和等待使用了大量park和unpark等操作,这些操作都需要系统转换到内核态进行操作,而用户态到内核态的转换是十分消耗资源的,因此Synchronized是重量级锁。原创 2023-10-07 21:24:34 · 35 阅读 · 1 评论 -
线程和进程
进程是一个程序的执行过程,当一个程序开始运行时,则会创建出一个进程,例如java程序通过main方法启动后,则会创建出一个进程。一个程序启动和关闭的过程也就是等于一个进程从创建、运行到关闭的过程。一个进程内有许多的线程,线程是轻量级的,可以通过线程来执行很多的事情,线程之间的切换比进程之间的切换耗费的资源较少。对于程序计数器、虚拟机栈、本地方法栈是线程私有的。原创 2023-10-07 21:24:02 · 22 阅读 · 1 评论 -
线程池使用
newCachedThreadPool 的线程池,队列为,只有在有线程获取任务时才能提交,最大线程数大小无限,空闲线程会在60s后销毁newSingleThreadExecutor 的线程池,任务队列是的,与的区别时,线程池如果继续执行。与newFixThreadPool(1)的区别是,fixThreadPool可以修改线程数,单线程线程池无法修改。newScheduledThreadPool 可以周期性执行任务,任务队列是延时队列 线程池的状态存储使用int 32位标识,前3位用原创 2023-10-07 21:23:21 · 59 阅读 · 1 评论 -
ThreadLocal
MDC用于在输出日志时打印对应的唯一id,在MDC中设置了REQ_ID后,logback输出日志时可以进行id的拦截从而保证在日志输出中同一个线程的id是相等的,因此可以通过id查看到一个请求链路的所有过程MDC提供了是接口,下层的logback实现类是基于ThreadLocal进行实现的,有在父子线程之间无法传递数据的问题。logger.info("开始调用服务A,进行业务处理");logger.info("业务处理完毕,可以释放空间了,避免内存泄露");原创 2023-10-07 21:22:29 · 30 阅读 · 1 评论 -
interrupt
*被阻塞的状态****退出阻塞状态****被阻塞的状态****中断标记去除**原创 2023-10-07 20:50:59 · 36 阅读 · 1 评论 -
JMM内存模型和Volatile
Java定义的**并发编程操作的一组规范**,除了抽象出**主内存与线程之间的关系**以外,还规定了**从Java代码到Cpu指令转换过程**的规定。制定这些规定是为了**简化程序员在并发环境下的开发**,因为Cpu多级缓存的模型和指令重排序的优化会影响并发编程下的结果,通过制定相关的规范,程序员可以通过实现了相关规范的关键字例如(Synchronized、Volatile等)从而更方便的写出安全的程序。volatile变量在**读操作**时,会调用操作是和的结合load_acquire可以看成先。原创 2023-10-07 20:49:54 · 34 阅读 · 1 评论 -
为什么Lock方法在try语句外
【代码】为什么Lock方法在try语句外。原创 2023-10-07 20:49:11 · 442 阅读 · 1 评论