
JUC
成为更好的qyk嘻嘻
一个努力的人
展开
-
JUC工具包下的集合
遗留的安全集合和修饰的安全集合都是使用synchronized修饰整个方法Java8:ConcurrentHashMap结构和HashMap一样,数组加链表,但是不允许空键值Get():取值全程无锁如果头结点的哈希值为-1,表示正在扩容;如果头结点的哈希值为-2,表示该链表已经变为红黑树了,这时调用对应的方法去取值如果头结点的哈希值大于0,说明是链表,直接取值即可,这里不会取到脏数据,因为值用了volatile修饰PutVal():放值如果哈希表为空,则调用initTable()(cas.原创 2022-03-12 15:44:06 · 1340 阅读 · 0 评论 -
缓存更新策略
先更新数据库再更新缓存 和 先更新缓存再更新数据库直接放弃,因为缓存有时候并不是数据库的直接数据,有可能是经过一系列计算得来的数据,如果更新缓存,代价太大先删缓存再更新数据库:问题:当线程A要更新数据,先把缓存删了,这时候线程B要获取数据,从缓存中得不到数据,就到数据库取,但是数据库的数据还没有被线程A更新,于是B获取到了脏数据并且将脏数据重新注入缓存中,造成以后取得数据都是脏的解决:1.加锁,将删缓存和更新数据库的操作视作一个整体,赋予原子性2.延迟双删,A删缓存,更新数据库,然后再次删缓存。原创 2022-03-11 19:57:59 · 1877 阅读 · 0 评论 -
自定义线程池总结
线程池:分成两个部分:线程池和阻塞任务队列先说阻塞任务队列:属性:1. 阻塞任务队列数据结构2. 从阻塞任务队列中添加任务和取走任务需要的锁3. 任务取完条件变量4. 任务为空条件变量5. 最大容量方法:1. 获取任务2. 带超时的获取任务3. 添加任务到阻塞任务队列4. 带超时的添加任务到阻塞任务队列5. 基于各种拒绝策略的放入任务到阻塞任务队列class BlockQueue<T>{ //1.阻塞任务队列 private Deque<T&原创 2022-03-09 11:41:53 · 383 阅读 · 0 评论 -
Synchronized不可打断 Reentranlock可打断
不可中断的意思是等待获取锁的时候不可中断,拿到锁之后可中断,没获取到锁的情况下,中断操作一直不会生效。Synchronized提供的打断操作只能是线程进入wait/time_wait状态后,另一个线程执行interrupt进行打断但是,当另一个线程执行interrupt时,则原线程没有锁,无法抛出被打断的异常,也就等待获取锁时不可中断Reentranlock可中断,因为有方法lockInterruptibly(),如果没有锁并且被打断的话会直接抛出被打断异常,也就是等待获取锁可中断...原创 2022-02-26 17:49:18 · 954 阅读 · 0 评论 -
阐明一下获得CPU时间和获得锁
一个线程,如果获得CPU时间,如果没有锁要求,直接运行时间内的代码如果获得CPU时间,有锁要求并且锁不在自己身上,阻塞到失去时间为止原创 2022-02-26 11:32:55 · 309 阅读 · 0 评论 -
join()导致死锁
public class Test22 { public static void main(String[] args) { Object lock = new Object(); Thread t1 = new Thread(()->{ try { Thread.sleep(1000); } catch (InterruptedException e) {原创 2022-02-26 11:02:18 · 463 阅读 · 0 评论 -
记一个Java并发小错误
class Account{ private int money; public Account(int money){ this.money = money; } public synchronized int getMoney() { return money; } public synchronized void setMoney(int money) { this.money = money;原创 2022-02-23 12:03:34 · 263 阅读 · 0 评论