
并发
文章平均质量分 77
A_BCDE_
这个作者很懒,什么都没留下…
展开
-
锁 笔记
获取同步状态失败,将当前线程构造为节点加入同步队列,并阻塞当前线程。一个线程请求锁时,只要获取同步状态则成功获取锁,在该前提下,刚释放的锁再次获取同步状态概率很大,导致线程切换次数少,非公平锁开销小。后继节点判断自己的前驱节点是否为首节点,是则获取同步状态,不是则等待。首节点获取同步状态成功,释放同步状态时,唤醒后继节点。获取同步状态失败,重新计算超时间隔等待xx纳秒,如果仍未获得同步状态则返回。优先级反转,饥饿现象,吞吐量大。int记录状态,fifo双向队列存储线程管理同步状态。功能:独占,共享,查询。原创 2023-05-21 17:57:49 · 665 阅读 · 0 评论 -
ThreadLocal
由于value 是强引用,不会被清理,依然存在,就会出现 key 为 null 的 value,value无法访问。然而由于threadLocalMap的生命周期=线程,线程池通常采取线程复用的方法,所以线程池中的线程很难结束。解决方式:用完threadLocal,调用remove清除无用的entry,由于Entry继承了弱引用类,会在下次GC时被JVM回收。方式二:ThreadLocal在每个线程中都创建了一个变量的副本,线程各自访问自己的副本变量,则不存在变量共享问题。关联线程和线程上下文。原创 2023-03-01 21:12:03 · 943 阅读 · 0 评论 -
JDK1.8 ConcurrentHashMap
将table分成n份 ,每份长度为stride,table大小除以CPU数量,平分给各个线程,每个线程对当前旧table中[transferIndex-stride, transferIndex-1]位置的结点进行迁移。迁移时不需要rehash,同hashmap一样计算新下标即可。JDK1.8 中采用CAS + synchronized,锁首节点,粒度更小。hash定位到node,复制节点前的链与节点后的链相连,跳过节点,即为删除。∵使用volatile修饰next,所以next值具有不变性,需要头插。原创 2023-03-01 17:17:20 · 694 阅读 · 0 评论 -
synchronized
JVM检查该标识符是否被设置,如果设置,则先获取monitor再执行方法体,执行完毕释放monitor。用逃逸技术判断一段代码中,堆上的数据不会逃逸出当前线程,则认为代码线程安全,不必加锁。设置自旋次数,超出次数即阻塞,若自旋成功则下次自旋次数增加,失败则下次自旋次数减少。系统实现线程切换需要在用户态和核心态之间转换,成本高时间长效率低。多个连续加锁加锁合并为一次,减少内核态和用户态的切换。轻量级锁CAS失败,自旋获取锁,cpu消耗大。增加了锁升级,在竞争激烈时,效率降低。monitor&对象 一对一。原创 2023-02-26 16:45:14 · 166 阅读 · 0 评论 -
CAS操作
当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。:内存地址V,旧的预期值A,即将要更新的目标值B。原创 2023-02-26 11:38:51 · 107 阅读 · 0 评论 -
java中的锁——偏向锁,轻量级锁,重量级锁
否则测试Mark Word中偏向锁的标识符是否为1(当前是否为偏向锁,1是0否),如果不是偏向锁则使用CAS竞争锁(使用CAS将对象头的偏向锁指向当前线程),如果是则尝试使用CAS将对象头的偏向锁指向当前线程。偏向锁的撤销,需要等待全局安全点(在这个时间点上没有字节码正在执行),它会首先暂停拥有偏向锁的线程,检查持有偏向锁的线程是否处于活动状态(同步代码块是否执行完),不处于活动状态则将对象头设置为无锁状态,线程可以使用CAS竞争锁。),那么该线程会自动获取锁,降低获取锁的代价。原创 2019-04-21 18:20:33 · 1881 阅读 · 2 评论 -
volatile
∴补足64字节(高速缓存行的长度)独占一个高速缓存行。原子性:与CAS结合保证原子性,volatile本身不保证操作原子性。线程安全:volatile不能保证操作的原子性,所以并不是线程安全的。volatile:线程访问共享变量,通过排它锁单独获得该变量。共享变量不足64字节,则与其他数据共同存在于一个高速缓存行。共享变量频繁写,则频繁锁定当前缓存行,其他处理器数据失效。一般高速缓存行64字节宽(有的32),不支持部分填充。∴volatile直接存于主存,易变,不稳定。顺序性:禁止指令重排序,效率↓。原创 2023-02-21 18:04:16 · 118 阅读 · 0 评论 -
java中的锁——对象锁、类锁
对象锁(方法锁)针对一个对象实例,只锁住当前的对象。在该对象的某个内存位置声明一个标识,说明该对象是否拥有锁。synchronized修饰普通方法,即为对象锁synchronized修饰的代码块传入this也属于对象锁//对象锁的两种形式public synchronized void fun() {}synchronized (obj) { ... }...原创 2019-04-29 16:03:21 · 702 阅读 · 1 评论