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

Java 并发锁

1 为什么要加锁

所先JVM将内存划分成2个区域

  • 主内存:所有线程共享的内存区域,存储所有的共享变量
  • 工作内存:每个线程独有的内存区域,存储该线程使用到的共享变量的副本

线程对变量的操作(读取、赋值)必须在工作内存完成,从主内存读取变量到工作内存,在对工作内存的变量进行操作,返回主内存。因此,当不同线程同时操作一个变量时,就会出现操作的数据实际值和主内存不一致。

2 需要解决那些问题

2.1 可见性问题 

  当一个共享变量被其他线程改变值后,其他线程无法立即感知到这个变量的值。

2.2 原子性

  无法确保对同一个共享变量操作是原子性的。

2.3 指令重排

  操作系统可能对一些操作指令进行重新排序,从而提高运行速度。例如一个对象赋值操作。 A a =  new A()。 单例模式时,会判断对象是否是空对象,所有要两次判断非空

  原本顺序:

    1. 分配内存空间

    2. 初始化对象

    3.  将引用指向内存

  重排序后顺序:

    1. 分配内存空间

    2. 将引用指向内存
    3. 初始化对象

2 常见锁类型

2.1 Synchronized

public class SynchronizedDemo {int i = 0;public static void main(String[] args) {SynchronizedDemo synchronizedDemo = new SynchronizedDemo();synchronizedDemo.init1();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(synchronizedDemo.i);}public void init1() {Thread[] threads = new Thread[100];for (int i = 0; i < 100; i++) {threads[i] = new Thread(this::fun1);threads[i].start();}}/*** 方法上锁*/synchronized void fun1() {i++;}}

  

http://www.jsqmd.com/news/9539/

相关文章:

  • 实用指南:点评中是如何实现短信登录的
  • 二分法算法技巧-思维提升 - 教程
  • 开源量子模拟引擎:Quantum ESPRESSO本地部署教程,第一性原理计算轻松入门! - 实践
  • 基于Python+Vue开发的大学竞赛报名管理系统源码+运行步骤
  • 详细介绍:QT常用控件(1)
  • Generate First, Then Sample: Enhancing Fake News Detection with LLM-Augmented Reinforced Sampling
  • 数据大屏
  • K8S上采用helm部署 Prometheus + Grafana
  • AI元人文的硅基基石体系:EPU+VPU+WBUC+WAUC深度解析——声明Ai解析
  • 详细介绍:VSCode+Cline 安装配置及使用说明
  • 题解:P4779 【模板】单源最短路径(标准版)
  • 网关配置
  • 高频感应钎焊在制冷行业的应用与优势:高效、绿色、智能的焊接革命!
  • 题解:P12672 「LAOI-8」近期我们注意到有网站混淆视听
  • 详细介绍:基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战
  • 完整教程:docker创建postgreSql带多个init的sql
  • vscode的文心快码插件不错
  • EPU+VPU+WBUC+WAUC:AI元人文的硅基基石体系
  • Educational Codeforces Round 183 (Rated for Div. 2)题解
  • 股市技术分析突破
  • 干货分享:无需下载,在线快速编辑图片的完整教程
  • 34.1STM32下的can总线实现知识(区分linux)_csdn - 详解
  • js实现promise常用场景使用示例
  • spatial for parallel compute 使用简介
  • Mermaid 绘图--以企业权限视图为例 - 详解
  • 英语_阅读_Balancing Benefits and Risks_待读
  • 读技术之外:社会联结中的人工智能02劳工
  • 详细介绍:如何有效删除 iPhone 上的所有内容?
  • 鼠标图标更改样式
  • webpack和vite的区别 - 指南