当前位置: 首页 > news >正文

总结 synchronized

目录

  • synchronized的特性
    • 1. 互斥
    • 2. 刷新内存
    • 3. 可重入
  • synchronized的使用
    • 1. 直接修饰普通方法
    • 2. 修饰静态方法
    • 3. 修饰代码块
  • synchronized的锁机制
    • 基本特点
    • 关键锁策略 : 锁升级

synchronized的特性

1. 互斥

synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized 中时, 其他线程如果也执行到同一个对象 synchronized 就会阻塞等待.

进入 synchronized 修饰的代码块, 相当于 加锁
退出 synchronized 修饰的代码块, 相当于 解锁

所有对象都可以作为 synchronized的锁(基本数据类型对象除外).

2. 刷新内存

synchronized 的工作过程 :

  1. 获得互斥锁
  2. 从主内存拷贝变量的最新副本到工作的内存
  3. 执行代码
  4. 将更改后的共享变量的值刷新到主内存
  5. 释放互斥锁

synchronized 也能保证内存可见性

3. 可重入

synchronized 对同一条线程来说是可重入的,不会出现自己把自己锁死的问题.
就是在锁里面再加一把锁, 并且两把锁的锁对象都是同一个, 一般来说要想进入第二把锁就得等第一把锁将锁对象释放了, 而第一把锁想释放就得进入并走出第二把锁, 这就产生了矛盾, 产生了死锁. 而 synchronized 并没有这样的问题.

synchronized的使用

synchronized 本质上要修改指定对象的 “对象头”. 从使用角度来看, synchronized 也势必要搭配一个具体的对象来使用.

1. 直接修饰普通方法

public class SynchronizedDemo {public synchronized void methond() {}
}

2. 修饰静态方法

public class SynchronizedDemo {public synchronized static void method() {}
}

3. 修饰代码块

锁当前对象

public class SynchronizedDemo {public void method() {synchronized (this) {}}
}

锁类对象

public class SynchronizedDemo {public void method() {synchronized (SynchronizedDemo.class) { //通过反射来获得对象}}
}

synchronized的锁机制

基本特点

  1. 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁.
  2. 开始是轻量级锁实现, 如果锁被持有的时间较长, 就转换成重量级锁.
  3. 实现轻量级锁的时候大概率用到自旋锁策略.
  4. 是一种不公平锁 (产生阻塞等待时, 不是按顺序来得到锁)
  5. 是一种可重入锁.
  6. 不是读写锁.

关键锁策略 : 锁升级

在这里插入图片描述
偏向锁不是真的 “加锁”, 只是打上一个 “标记”, 记录这个锁属于哪个线程.
如果后续没有其他线程来竞争该锁, 那么就不用进行其他操作了(避免了加锁解锁的开销)
如果后续其他线程来竞争这把锁了, 偏向锁就升级为自旋锁(轻量级锁), 如果竞争进一步激烈, 自旋不能快速获取到锁状态, 就会变为重量级锁.

http://www.lryc.cn/news/43903.html

相关文章:

  • 360周鸿祎又“开炮”:GPT 6-8就将产生自主意识!我们来测算一下对错
  • python——飞机大战小游戏
  • 数组(完全二叉树)向下建堆法与堆排序O(N*logN)
  • Lua require 函数使用
  • 【面试】如何定位线上问题?
  • 字节二面,原来我对自动化测试的理解太浅了
  • Android11.0 应用升级成功后立即断电重启,版本恢复
  • 关于python常用软件用法:Pycharm 常用功能
  • SOLIDWORKS你不知道的小技巧
  • 有了HTTP,为啥还要用RPC
  • [leetcode] 动态规划
  • 科大奥瑞物理实验——热电偶特性及其应用研究
  • Eclips快捷键大全(超详细)
  • 整懵了,蚂蚁金服4面成功拿下测开offer,涨薪10k,突然觉得跳槽也不是那么难
  • C++内存分布malloc-free-new-delete的区别和联系
  • 【华为OD机试 2023最新 】 最多颜色的车辆(C++ 100%)
  • Linux安全加固
  • Java基础学习(6)
  • 【LeetCode】链表练习 9 道题
  • 轴承远程监控系统解决方案
  • 阿里云轻量服务器Workbench root远程连接和一键连接的区别
  • 带你用纯C实现一个内存池(图文结合)
  • ChatGPT使用案例之图像生成
  • 蚁群算法优化旅行问题
  • 树数据结构
  • Spring Boot整合Redis并提供多种实际场景的应用
  • VR全景图片,助力VR全景制作,720全景效果图
  • Kali Linux20款重要软件
  • C语言测试五
  • 【微服务~原始真解】Spring Cloud —— 访问数据库整合Druid数据源