礼服购物车网站模板,手机网站可以做百度商桥吗,重庆公司网站建设步骤,镇江建设网站的公司#x1f308;#x1f308;#x1f308;今天给大家分享的是Java中 synchronized 的基本原理 清风的CSDN博客 #x1f6e9;️#x1f6e9;️#x1f6e9;️希望我的文章能对你有所帮助#xff0c;有不足的地方还请各位看官多多指教#xff0c;大家一起学习交流#xff… 今天给大家分享的是Java中 synchronized 的基本原理 清风的CSDN博客 ️️️希望我的文章能对你有所帮助有不足的地方还请各位看官多多指教大家一起学习交流 ✈️✈️✈️动动你们发财的小手点点关注点点赞在此谢过啦哈哈哈 目录
一、synchronized 基本特点
二、加锁工作过程
2.1 偏向锁
2.2 轻量级锁
2.3 重量级锁 三、其他的优化操作
3.1 锁消除
3.2 锁粗化 一、synchronized 基本特点 结合上篇文章给大家分享的锁策略 , 我们就可以总结出 , Synchronized 具有以下特性 ( 只考虑 JDK 1.8)。 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁开始是轻量级锁实现, 如果锁被持有的时间较长, 就转换成重量级锁实现轻量级锁的时候大概率用到的自旋锁策略 是一种不公平锁 是一种可重入锁 不是读写锁
二、加锁工作过程
JVM 将 synchronized 锁分为 无锁、偏向锁、轻量级锁、重量级锁 状态。会根据情况进行依次升级。 2.1 偏向锁 第一个尝试加锁的线程 , 优先进入偏向锁状态。 偏向锁不是真的 加锁, 只是给对象头中做一个 偏向锁的标记, 记录这个锁属于哪个线程如果后续没有其他线程来竞争该锁, 那么就不用进行其他同步操作了(避免了加锁解锁的开销) 如果后续有其他线程来竞争该锁(刚才已经在锁对象中记录了当前锁属于哪个线程了, 很容易识别当前申请锁的线程是不是之前记录的线程), 那就取消原来的偏向锁状态, 进入一般的轻量级锁状态。 偏向锁本质上相当于 延迟加锁 能不加锁就不加锁, 尽量来避免不必要的加锁开销。 但是该做的标记还是得做的, 否则无法区分何时需要真正加锁。 举个例子理解偏向锁 假设男主是一个锁, 女主是一个线程。如果只有这一个线程来使用这个锁, 那么男主女主即使不领证结婚(避免了高成本操作), 也可以一直幸福的生活下去。 但是女配出现了, 也尝试竞争男主, 此时不管领证结婚这个操作成本多高, 女主也势必要把这个动作完成了, 让女配死心。 2.2 轻量级锁 随着其他线程进入竞争 , 偏向锁状态被消除 , 进入轻量级锁状态 ( 自适应的自旋锁 )。此处的轻量级锁就是通过 CAS(后面我会给大家详细介绍) 来实现。 通过 CAS 检查并更新一块内存 (比如 null 该线程引用) 如果更新成功, 则认为加锁成功 如果更新失败, 则认为锁被占用, 继续自旋式的等待(并不放弃 CPU) 自旋操作是一直让 CPU 空转, 比较浪费 CPU 资源。因此此处的自旋不会一直持续进行, 而是达到一定的时间/重试次数, 就不再自旋了。也就是所谓的 自适应。 2.3 重量级锁 如果竞争进一步激烈 , 自旋不能快速获取到锁状态 , 就会膨胀为重量级锁此处的重量级锁就是指用到内核提供的 mutex 。 执行加锁操作, 先进入内核态在内核态判定当前锁是否已经被占用 如果该锁没有占用, 则加锁成功, 并切换回用户态如果该锁被占用, 则加锁失败 此时线程进入锁的等待队列, 挂起等待被操作系统唤醒经历了一系列的沧海桑田, 这个锁被其他线程释放了, 操作系统也想起了这个挂起的线程, 于是唤醒这个线程, 尝试重新获取锁 三、其他的优化操作
3.1 锁消除
编译器JVM 判断锁是否可消除如果可以, 就直接消除。什么是 锁消除 有些应用程序的代码中, 用到了 synchronized, 但其实没有在多线程环境下(例如 StringBuffer)
StringBuffer sb new StringBuffer();
sb.append(a);
sb.append(b);
sb.append(c);
sb.append(d);此时每个 append 的调用都会涉及加锁和解锁但如果只是在单线程中执行这个代码, 那么这些加 锁解锁操作是没有必要的, 白白浪费了一些资源开销。 3.2 锁粗化 一段逻辑中如果出现多次加锁解锁 , 编译器 JVM 会自动进行锁的粗化。 锁的粒度: 粗和细 实际开发过程中, 使用细粒度锁, 是期望释放锁的时候其他线程能使用锁。但是实际上可能并没有其他线程来抢占这个锁这种情况 JVM 就会自动把锁粗化, 避免频繁申请释放锁。 举个例子理解锁粗化 滑稽老哥当了领导, 给下属交代工作任务: 方式一: 打电话, 交代任务1, 挂电话打电话, 交代任务2, 挂电话打电话, 交代任务3, 挂电话 方式二: 打电话, 交代任务1, 任务2, 任务3, 挂电话 显然, 方式二是更高效的方案。 好啦今天的分享就到这里 ️️️希望各位看官读完文章后能够有所提升。 创作不易还希望各位大佬支持一下 ✈️✈️✈️点赞你的认可是我创作的动力 ⭐⭐⭐收藏你的青睐是我努力的方向 ✏️✏️✏️评论你的意见是我进步的财富