当前位置: 首页 > 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.hskmm.com/?act=detail&tid=25973

相关文章:

  • 实用指南:点评中是如何实现短信登录的
  • [数学 - 方差 标准差 ]
  • ???
  • 基于Python+Vue开发的大学竞赛报名管理系统源码+运行步骤
  • 详细介绍:QT常用控件(1)
  • Generate First, Then Sample: Enhancing Fake News Detection with LLM-Augmented Reinforced Sampling
  • 2021年顶尖技术博客文章精选
  • Injectics漏洞挖掘实战:从SQL注入到SSTI攻击完整解析
  • K8S上采用helm部署 Prometheus + Grafana
  • AI元人文的硅基基石体系:EPU+VPU+WBUC+WAUC深度解析——声明Ai解析
  • 题解:P4779 【模板】单源最短路径(标准版)
  • 网关配置
  • 高频感应钎焊在制冷行业的应用与优势:高效、绿色、智能的焊接革命!
  • 题解:P12672 「LAOI-8」近期我们注意到有网站混淆视听
  • 详细介绍:基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战
  • EPU+VPU+WBUC+WAUC:AI元人文的硅基基石体系
  • 股市技术分析突破
  • 干货分享:无需下载,在线快速编辑图片的完整教程
  • 34.1STM32下的can总线实现知识(区分linux)_csdn - 详解
  • js实现promise常用场景使用示例
  • 英语_阅读_Balancing Benefits and Risks_待读
  • 大模型部署
  • 读技术之外:社会联结中的人工智能02劳工
  • linux
  • 鼠标图标更改样式
  • webpack和vite的区别 - 指南
  • m3u8在线播放测试的方法与常见问题解决方案(附网页演示
  • 校招题
  • Manim实现旋转扭曲特效
  • go语言学习 第5章:函数 - 详解