# 深入理解 Java 虚拟机 (二)

深入理解 Java 虚拟机 (二)

Java内存模型

主内存与工作内存

  • 所有的变量存储在主内存(虚拟机内存的一部分)
  • 每条线程有自己的工作内存,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行、不能直接读写主内存中的数据。
  • 不同的线程无法直接访问对方工作内存中的变量。
    在这里插入图片描述

内存间交互操作

  • Java中,内存之间的交互操作通常是通过对象的引用来实现的。当一个对象被创建时,它被存储在堆内存中,并且在栈内存中分配一个引用指向该对象。通过这个引用,可以访问和操作对象的数据和方法。
8种基本操作
  • lock:锁定,作用于主内存变量,它把一个变量标识为一条线程独占的状态。

  • unlock:解锁,解锁后的变量才能被其他线程锁定。

  • read:读取,作用于主内存变量,它把一个主内存变量的值,读取到工作内存中。

  • load:载入,作用于工作内存变量,它把read读取的值,放到工作内存的变量副本中。

  • use:使用,作用于工作内存变量,它把工作内存变量的值传递给执行引擎,当JVM遇到一个变量读取指令就会执行这个操作。

  • assign:赋值,作用于工作内存变量,它把一个从执行引擎接收到的值赋值给工作内存变量。

  • store:存储,作用域工作内存变量,它把工作内存变量值传送到主内存中。

  • write:写入,作用于主内存变量,它把store从工作内存中得到的变量值写入到主内存变量中。

原子性可见性与有序性

原子性
  • 原子性是指一个操作或者多个操作要么全部执行并且对外部可见,要么都不执行,不会出现中间状态。
  • Java 中,通过 synchronized 关键字和 Lock 接口来实现原子性操作。
可见性
  • 可见性是指一个线程对共享变量的修改能够及时地被其他线程观察到。
  • Java 中,通过 volatile 关键字和 synchronized 关键字来实现可见性。
  • volatile 关键字可以保证共享变量的可见性,但不能保证原子性;synchronized 关键字可以保证共享变量的原子性和可见性。
有序性
  • 有序性是指一个线程中的操作按照程序代码的先后顺序执行,并且不会被重排序。
  • Java 中,由于处理器、编译器和虚拟机等因素的影响,程序代码中的操作可能会被重排序,从而导致多线程程序出现不可预期的结果。
  • 为了保证有序性,Java 提供了 happens-before 规则,用于定义操作之间的执行顺序。例如,一个unlock操作happens-before于后续对同一个锁的lock操作。

锁优化

自旋锁

  • 自旋锁(Spin Lock)是一种基本的锁实现方式,它是一种忙等待的锁,线程在获取锁时不会被挂起,而是循环检测锁的状态直到获取到锁为止。
  • 自旋锁适用于临界区代码执行时间非常短暂的情况,避免线程频繁地切换和阻塞,提高了锁的性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值