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

同步锁: synchronized

synchronized

  • 1. synchronized的特性
  • 2. synchronized的使用
  • 3. synchronized的锁机制

1. synchronized的特性

  1. 原子性: 所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
  2. 可见性: 可见性是指多个线程访问一个资源时,该资源的状态、值信息等对于其他线程都是可见的。
  3. 有序性: 有序性指程序执行的顺序按照代码先后执行。

2. synchronized的使用

Synchronized主要有三种用法:

  1. 修饰实例方法: 作用于当前对象实例加锁,进入同步代码前要获得 当前对象实例的锁.
  2. 修饰静态方法: 也就是给当前类加锁,会作用于类的所有对象实例 ,进入同步代码前要获得 当前 class 的锁. 因为静态成员不属于任何一个实例对象,是类成员( static 表明这是该类的一个静态资源,不管 new 了多少个对象,只有一份)。所以,如果一个线程 A 调用一个实例对象的非静态 synchronized 方法,而线程 B 需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁。
  3. 修饰代码块 :指定加锁对象,对给定对象/类加锁。synchronized(this|object) 表示进入同步代码库前要获得给定对象的锁。synchronized(类.class) 表示进入同步代码前要获得 当前 class 的锁.

总结:
synchronized 关键字加到 static 静态方法和 synchronized(class) 代码块上都是是给 Class 类上锁。
synchronized 关键字加到实例方法上是给对象实例上锁。

3. synchronized的锁机制

当一个方法或者一段代码块被 synchronized 修饰时并不会立即调用方法进行加锁, 而是先从无锁状态进入到偏向锁, 当没有产生锁冲突时就不进行加锁, 这样可以减少一些加锁解锁的开销, 当产生锁冲突时就会立即加锁从而变成轻量级锁, 当锁冲突进一步剧烈就会转变成重量级锁.
在这里插入图片描述

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

相关文章:

  • 【微服务】springboot 多模块打包使用详解
  • 嵌入式工程师面试经常遇到的30个经典问题
  • ER系列路由器多网段划分设置指南
  • 3 PostGIS基础查询
  • Shell错误:/bin/bash^M: bad interpreter: No such file or directory
  • Golang之路---01 Golang的安装与配置
  • Anolis OS 8.8服务器采用docker容器方式搭建gerrit3.8.1服务
  • PyTorch 中的多 GPU 训练和梯度累积作为替代方案
  • Appium+python自动化(三十五)- 命令启动appium之 appium服务命令行参数(超详解)
  • vmware的window中安装GNS3
  • FPGA XDMA 中断模式实现 PCIE3.0 AD7606采集 提供2套工程源码和QT上位机源码
  • 某某大学某学院后台Phar反序列化GetShell
  • 【ChatGPT辅助学Rust | 基础系列 | 基础语法】变量,数据类型,运算符,控制流
  • 使用云服务器和Frp(快速反向代理)框架快速部署实现内网穿透
  • Mac 上使用 Tesseract OCR 识别图片文本
  • 《MapboxGL 基础知识点》- 放大/缩小/定位/级别
  • VScode的简单使用
  • # Unity 如何获取Texture 的内存大小
  • dolphinscheduler switch+传参无坑版
  • VINS-fusion安装
  • 智慧消防:如何基于视频与智能分析技术搭建可视化风险预警平台?
  • selenium定位元素的方法
  • RISC-V特权级别
  • RISC-V 指令集介绍
  • 操作系统5
  • K8S系列文章之 Docker常用命令
  • 谷歌: 安卓补丁漏洞让 N-days 与 0-days 同样危险
  • linux 学成之路(基础篇)(二十三)MySQL服务(下)
  • MySQL初探
  • blender 用蒙版添加材质