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

Java synchronized 关键字

synchronized 是什么?

synchronized 是 Java 中的一个关键字,翻译成中文就是 同步 的意思,主要解决的是多个线程之间访问资源的同步性,可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行


如何使用 synchronized?

synchronized 关键字的使用方式主要有以下三种:

  1. 修饰实例方法
  2. 修饰静态方法
  3. 修饰代码块

1. 修饰实例方法(锁当前对象实例)

给当前对象实例加锁,进入同步代码前要获得 当前对象实例的锁

synchronized void method(){
}

2. 修饰静态方法(锁当前类)

给当前类加锁,会作用于类的所有对象实例,进入同步代码前要获得 当前 class 的锁

这是因为静态成员不属于任何一个实例对象,归整个类所有,不依赖于类的特定实例,被类的所有实例共享。

synchronized static void method(){
}

静态 synchronized 方法和非静态 synchronized 方法之间的调用互斥吗?

不互斥。如果线程 A 调用一个 实例对象的非静态 synchronized 方法,而线程 B 需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁。

3. 修饰代码块(锁指定对象/类)

对括号里指定的对象/类加锁:

  • synchronized(object) 表示进入同步代码库前要获得 给定对象的锁
  • synchronized(类.class) 表示进入同步代码前要获得 给定 Class 的锁
synchronized (this){
}

总结

  • synchronized 关键字加到 static 静态方法和 synchronized(class) 代码快上都是给 class 类加锁
  • synchronized 关键字加到实例方法上是给对象实例加锁
  • 尽量不要使用 synchronized(String a) ,因为 JVM中,字符串常量池具有缓冲功能、

构造方法不能使用 synchronized 关键字修饰。

构造方法本身就属于线程安全的,不存在同步的构造方法一说


synchronized 和 volatile 有什么区别?

synchronized 关键字和 volatile 关键字是两个互补的存在,而不是对立的存在。

  • volatile 关键字是线程同步的轻量级实现,所以 volatile 性能比 synchronized 关键字要好。但是 volatile 关键字只能用于变量而 synchronized 关键字可以修饰方法以及代码块
  • volatile 关键字能保证数据的可见性,但不能保证数据的原子性。synchronized 关键字两者都能保证。
  • volatile 关键字主要用于解决变量在多个线程之间的可见性,而 synchronized 关键字解决的是多个线程之间访问资源的同步性。

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

相关文章:

  • 滑动窗口算法(C语言描述)
  • 【已修复】vcruntime140.dll有什么用,vcruntime140.dll缺失如何修复
  • 10月12日,每日信息差
  • 网络安全技术(黑客学习)——自学方法
  • 引领创新浪潮:“Polygon探寻新技术、新治理、新代币的未来之路!“
  • Android 13.0 添加自定义服务,并生成jar给第三方app调用
  • PG14归档失败解决办法archiver failed on wal_lsn
  • YB4014是可以对单节磷酸铁锂电池进行恒流/恒压充电管理的集成电路。
  • STL——查找算法及实例
  • Ant Design Form.List基础用法
  • 怎么优化H5让它可以在300ms以内打开?
  • Zabbix安装出现必要条件检查失败
  • 精通Maven的捷径:一文包揽所有必知必学
  • SpringCloud溯源——从单体架构到微服务Microservices架构 分布式和微服务 为啥要用微服务
  • springboot 配置 servlet filter 2
  • 前端axios下载导出文件工具封装
  • Web应用防火墙的性能优化技术
  • 华为HCIP题库h12-821题库新增30题
  • 智慧办公数据可视化大屏设计(数据可视化)、大数据、数据大屏、办公数据大屏、办公数据
  • echarts实现横轴刻度名倾斜展示,并且解决文字超出部分消失问题
  • awk常用统计命令
  • Linux:【Kafka四】集群介绍与单机搭建
  • 代码随想录算法训练营Day52|动态规划11
  • Android渲染系列之原理概述篇
  • 类图 UML从入门到放弃系列之二
  • 诊断用抗原抗体——博迈伦
  • 156 - Ananagrams (UVA)
  • vue3入门
  • 上机实验二 设计单循环链表 西安石油大学数据结构
  • 小谈设计模式(28)—解释器模式