
JUC
不骄不傲
低调人生,从不装逼
展开
-
Java可重入读写锁ReentrantReadWriteLock之实战缓存
简介 写一个简单的缓存读写锁demo, 基本操作set和get, set是写锁,get是读锁. 反例 没加读写锁前的程序执行 public class ReadWriteLockDemo { public static void main(String[] args) { for (int i = 0; i < 5; i++) { final int temp = i; new Thread(()->{原创 2020-08-31 22:12:21 · 516 阅读 · 1 评论 -
Java中利用AtomicReference手写自旋锁Demo
自旋锁简介 自旋锁是一种非阻塞锁,抢到执行权的线程并不会自旋,自旋的精髓在于没抢到执行权的线程,它们会空转cpu,一直循环,这就是自旋,并非把线程改为阻塞状态.它们还是在运行的,自旋重试想获取锁. 源代码 public class SpinLockDemo { public static AtomicReference<Thread> spinLock = new AtomicReference<>(); private static Integer count原创 2020-08-27 22:42:50 · 756 阅读 · 1 评论 -
Java中可重入锁synchronized,ReentrantLock简介
可重入锁 即可以加锁多次,解锁也可以多次,且加锁解锁次数相抵消才行. synchronized和ReentrantLock都是可重入锁 代码案例演示 public class ReentrantLockDemo2 { private static ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { new Thread(()->{原创 2020-08-27 21:37:05 · 266 阅读 · 0 评论 -
简单介绍newFixedThreadPool线程池原理
实现原理 底层是采用队列来存储进来的线程,如果工作队列满了无空闲工作线程,则加入队列阻塞,如果工作线程有空闲,则不用阻塞直接被执行.默认是一个无界队列int.MAX_VALUE这么大,如果请求过大会造成JVM内存OOM ...原创 2020-08-25 22:10:53 · 677 阅读 · 0 评论 -
简单介绍AQS底层原理
AQS简介 全称Abstract Queued Synchronizer, 抽象队列同步器,它是并发包中的基础类,比如ReentrantLock就基于AQS实现可重入锁 AQS原理 AQS中有state丶临界区线程丶等待队列三个重要部分组成 其中线程去CAS更新state为1,更新成功的线程进入代码临界区,其它CAS更新失败的线程进入等待队列 临界区线程释放锁后,唤醒等待队列线程.如果此时有其它线程进来CAS更新state为1,那么等待队列线程继续等待,这就是被插队,非公平锁,Java中ReentrantL原创 2020-08-25 21:51:54 · 849 阅读 · 0 评论 -
Java中公平锁和非公平锁各自的特点
公平锁 公平锁对于线程来说是先请求先调度执行,即FIFO队列,队列头部第一个线程永远先执行,吞吐量不理想. 例如Java中的ReentrantLock可以通过参数改为公平锁,默认是非公平锁. FairSync()实现类公平锁 非公平锁 非公平锁见名知意,并不是线程先请求就会先被执行,底层是采用某种机制可能是优先权抢占,短线程抢占,来抢锁,好处就是提高了系统的吞吐量,其中短线程抢占算法可能会导致长线程得不到执行产生"饥饿"现象,不过可以采用"老化技术"来解决饥饿问题. 总结 至于使用什么锁,是需要看使用场原创 2020-08-10 22:30:43 · 579 阅读 · 0 评论 -
Java分布式锁之ZooKeeper实现思路
ZooKeeper实现分布式锁思路实现思路分布式锁核心思路总结 实现思路 在分布式的场景中,保证线程安全并不是单机版JVM简单的lock,unlock就完事的,分布式锁是需要一台服务器来协调,多台JVM中都要访问临界资源是通过这台服务器保证有序性丶安全性,数据一致性. 所以需要准备一台服务器装上ZooKeeper. 分布式锁核心思路 获取锁方法(lock)思路,在ZooKeeper中创建临时结点,一个会话结束后就删除结点,即创建结点成功=持有锁,会话结束=释放锁. 如果某个JVM在ZooKeeper中拿到锁原创 2020-07-06 12:43:17 · 148 阅读 · 0 评论 -
Spring Boot Web项目ConcurrentLinkedQueue+ReentrantLock+Condition实现消费者功能(类似MQ队列)
Spring Boot Web项目ConcurrentLinkedQueue+ReentrantLock+Condition实现消费者功能(类似MQ队列) 业务场景 前台注册时,给用户的邮箱异步发送邮件用于激活账户.服务器资源紧张不能引入MQ队列来实现,所以用JUC写了个消费者功能废话不多说直接上代码 项目结构 代码 消费者核心代码 /** * 描述: 消费者线程 * date: 2020/6/22 0022 **/ @Slf4j public class ConsumerTask implemen原创 2020-06-22 10:22:14 · 1163 阅读 · 0 评论