并发
文章平均质量分 88
皮皮杨233
这个作者很懒,什么都没留下…
展开
-
升级为重量级锁,锁重入会导致锁释放?
近日,看到有些文章说“产生竞争时,轻量级锁升级为重量级锁,此时持锁线程执行CAS操作(锁重入)会失败,所以将会提前释放锁”首先,持锁线程可能连同步块都未执行完成就平白无故将锁释放掉,怎么想都不合理接下来的实验将证明上述“提前释放锁”结论的错误性实验结果表明,即使锁已经升级为重量级锁,持锁线程执行锁重入操作并未发生阻塞,所以也就不存在释放锁一说锁已经升级,但是持锁线程可能确实并不知情,本人猜测在锁重入或者解锁时发现已经升级为重量级锁httpshttps。.........原创 2022-07-16 11:34:25 · 375 阅读 · 1 评论 -
并发编程 synchronized (四) 深入分析线程安全
常见线程安全类 String Integer StringBuffer Random Vector Hashtable java.util.concurrent 包下的类 线程安全类也会线程不安全 如:Vector public synchronized int size() { // 返回大小 return elementCount; } public synchronized E remove(int index) { // 移除操作 .原创 2021-08-09 22:04:54 · 116 阅读 · 0 评论 -
并发编程 synchronized (七) wait / notify
目录 wait / notify 介绍 wait 与 sleep 对比 保护性暂停(join 原理) 定义 实现 join 实现(带超时的 Guarded Object) 生产者/消费者 定义 实现 wait / notify 介绍 ① wait:当 Thread3、Thread4 获得锁时,由于没有达到执行条件(Thread3 要锤子,Thread4 要扳手);于是调用 wait,进入左边 WaitSet 等待(等人送工具,没人送会一直等) ② notif...原创 2021-08-13 19:32:31 · 415 阅读 · 1 评论 -
HashMap1.7 扩容时产生死链
HashMap1.7 扩容机制 HashMap1.7 扩容机制:当 put 一个新键值对时;发生了哈希碰撞(hash值相同)并且加上新键值对后,键值对总数达到了阈值(容量 * 0.75) ① 如:容量为 16 的HashMap,每个位置都放了一个键值对;它并不会扩容,因为没有发生哈希碰撞 ② 提问:容量为 16 的HashMap,最多可以放多少个键值对? 答:26个 在 0 号位置先加入 11 个键值对(其他位置都可以),然后将剩余空位置填满;结果为 11+15=26;假如再 put 一个新键值原创 2021-08-07 18:13:32 · 1077 阅读 · 0 评论 -
并发编程 synchronized (一) 初识
上下文切换对非原子操作的影响 示例 我们都知道,两个线程 Thread0 与 Thread1,对同一个量 count 进行操作;一个让其自增,一个让其自减,次数相等;结果可能为 负数、正数、0(极少) 示例代码: package com.juc.ppy.synchronize; import lombok.extern.slf4j.Slf4j; @Slf4j(topic = "c.UnsafeCount") public class UnsafeCount { static in.原创 2021-08-08 19:34:46 · 209 阅读 · 1 评论 -
并发编程 synchronized (六) 偏向锁
偏向锁 用途 public void method1(){ synchronized(object){ method2(); } } public void method2(){ synchronized(object){ method3(); } } public void method3(){ synchronized(object){ // 执行代码 } } 没有线程竞争时,持锁线程反复获取锁原创 2021-08-11 22:51:05 · 390 阅读 · 0 评论 -
并发编程 synchronized (三) 变量是否线程安全
目录 线程安全情况 单线程操作变量 多个线程对变量只读 或者 变量不属于共享资源 线程不安全情况 多线程对变量既读又写 子类重写父类方法执行未知操作 变量:普通成员变量、静态成员变量、局部变量 ① 变量不属于多线程共享资源或者不被多线程共享,则线程安全 ② 变量被线程共享;但是只有读操作,不包含任何写(修改)操作;则线程安全 线程安全情况 单线程操作变量 @Slf4j(topic = "c.SafeThread") public class SafeThread { ...原创 2021-08-09 17:07:05 · 274 阅读 · 0 评论 -
volatile(二)模式与规则
两阶段终止 说明 Two Phase Termination 在线程 t1 中优雅地终止线程 t2 错误方法: ① 使用线程对象的 stop 方法,会真正杀死线程,但是线程持有锁的话,它就无法释放,其他线程也就无法获得锁 ② System.exit(int) 会将整个进程杀死 利用共享标记打断 @Slf4j(topic = "c.TwoPhaseTermination") public class TwoPhaseTermination { private Thread t..原创 2021-08-23 19:31:38 · 360 阅读 · 0 评论 -
并发编程 synchronized (五) 重量级锁、轻量级锁
目录 Monitor(重量级锁) 对象头 组成 工作机制 轻量级锁 加锁过程 锁重入 锁膨胀(转为重量级锁) 自旋 Monitor(重量级锁) 对象头 每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级锁)之后,在该对象头的 Mark Word 中设置指向该 Monitor 的指针 Mark Word(64 位) 锁不同时,Mark Word 会发生变化 Klass Word 指向该对象的类型...原创 2021-08-10 21:52:42 · 398 阅读 · 0 评论 -
并发编程 synchronized (二) 两种锁
对象锁 定义 形如: synchronized void method(){ // 在普通成员方法上加锁 // 临界区 } void method(){ synchronized(this){ // 锁住当前对象 // 临界区 } } 两种方式的临界区,对于同一个对象是等效的 对象锁例子 在普通方法上加锁(相同对象调用相同方法) package com.juc.ppy.synchronize; import lombok.extern.slf原创 2021-08-09 11:51:56 · 442 阅读 · 0 评论 -
线程状态转换
目录 总览 各种情况 情况 1:新建线程 情况 2:永久等待 情况 3:等待其他线程 情况 4:park && unpark 情况 5:有时限等待 情况 6:有时限等待其他线程 情况 7:睡眠 情况 8:有时限 park 情况 9:竞争锁 情况 10:运行完毕 总览 各种情况 情况 1:新建线程 NEW --> RUNNABLE 调用 t.start() 情况 2:永久等待 RUNNABLE <--> WAITING 线原创 2021-08-18 22:04:28 · 107 阅读 · 0 评论 -
线程活跃性 && ReentrantLock
目录 线程活跃状态 死锁 活锁 饥饿 ReentrantLock 特点 特点展示 可重入 可打断 可设置超时时间 可设置为公平锁 支持多个条件变量 解决死锁问题 线程活跃状态 死锁 当一个线程需要同时获取多把锁时,容易发生死锁。 @Slf4j(topic = "c.DeadLock") public class DeadLock { public static void main(String[] args) { Object loc...原创 2021-08-19 21:48:25 · 189 阅读 · 0 评论 -
volatile(一)作用与原理
Java 内存模型 ① JMM(Java Memory Model),定义了主存(共享)、工作内存(私有)抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等 ② JMM 体现在以下几个放面(并发安全也如此): 2.1 原子性:保证指令不受到线程上下文切换影响(指令交错) 2.2 可见性:保证指令不受CPU 缓存影响 2.3 有序性:保证指令不受 CPU 指令并行优化影响(指令重排) 可见性 退不出的循环 static ...原创 2021-08-22 19:09:06 · 542 阅读 · 0 评论 -
秒杀重点(后端)
目录 1.tomcat 线程池参数优化 2.分布式 nginx 反向代理 3.数据库分服务器 4.多级缓存(查询) 5. nginx lua(最前置热点缓存) 6. 消息中间件(抢单) 7.流量削峰 8.防刷限流 1.tomcat 线程池参数优化 ① 最大连接数 ② 超时时间 2.分布式 nginx 反向代理 ① 多服务器,分布式分流 3.数据库分服务器 ① MySQL(索引优化,字段分表减少锁竞争) ② redis 4.多级缓存(查询) ① redi.原创 2022-02-15 16:10:29 · 1074 阅读 · 3 评论 -
线程池原理
目录 属性 核心属性 阻塞队列 饱和策略 状态属性 状态分类 状态转换 新增任务 处理流程 属性 核心属性 int corePoolSize:核心线程数量 int maximumPoolSzie:最大线程数量 long keepAliveTime:非核心线程的最大空闲等待时间 boolean allowCoreThreadTimeOut:核心线程也使用最大空闲等待时间;默认 false BlockingQueue<Runnable> workQueu..原创 2022-01-20 19:35:23 · 843 阅读 · 0 评论 -
ConcurrentHashMap 1.7 & 1.8
juc重点原创 2021-12-15 22:15:29 · 932 阅读 · 0 评论