(二)深入理解Java虚拟机-Java内存模型与线程

Java内存模型

Java内存模型的主要目标是定义程序中各个变量的访问规则,在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节
Java内存模型规定所有的变量都存储在主内存(Main Memory),每条线程还有自己的工作空间(Working Memory)
Java内存模型围绕着在并发过程中如何处理 原子性可见性有序性 3个特征来建立的。
线程的工作内存保持了被该线程使用到的 变量的 主内存的 副本拷贝。
读取赋值操作在工作内存,不能操作主内存的变量。
注意:对象的引用,对象中某个在线程中访问到的字段都可能存在拷贝。volatile变量依然有工作内存的拷贝,由于他特殊的操作顺序性,所以看起如同直接在主内存中读写一样。
经典内存模型图
经典内存模型图
内存间8中操作交互方式:

  • lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态
  • unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
  • read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中
  • load(载入):作用于工作内存的变量,它把read操作从主内存中得的的变量朱放入工作内存的变量副本中
  • use(使用):作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎
  • assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到到的值赋值给工作内存的变量
  • store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中

注意:多次执行lock,只有执行相同次数的unlock,变量才会被解锁

volatile型变量的特殊规则:
当变量被定义volatile之后,有两个特性:

  • 保证词变量对所有线程的可见性(可见性主要体现在当某一条线程修改了这个变量,新值对其他线程来说是立即得知的)
  • 禁止指令重排序优化(普通变量只保证值正确,不保证执行顺序)

由于volatile变量只能保证可见性,如果不符合这两条规则,我们仍然要通过加锁(synchronized或者原子类)来 保证原子性:

  • 运算结果并不依赖变量的当前值,或者只能够保只有单一线程修改变量的值
  • 变量不需要与其他状态变量共同参与年不变的约束

我们在volatile与锁之间选择的唯一依据仅仅是volatile的语义能否满足使用场景的需求

虚拟机天然先行发生关系:

  • 程序次序规则(Progress Order Rule)
  • 管程锁定规则(Monitor Lock Rule)
  • volatitle变量规则(Volatile Variable Rule)
  • 线程终止规则(Thread Termination Rule)
  • 线程中断规则(Thread Interruption Rule)
  • 对象终结规则(Finalizer Rule)
  • 传递性规则(Transitivity)

线程实现的3中方式:内核线程实现,用户线程实现,用户线程加轻量级进程混合实现

线程与进程区别与联系:

  • 我们通常意义上讲的线程是指用户线程
  • 系统内核线程的高级接口实现即是我们讲的轻量级进程

线程

Sun JDK 在 Window 和 Linux 版都是使用一对一的线程模型实现

JDK线程

Java使用的线程调度方式:抢占式调度
Java 提供
1. Process 与 ProcessBuilder 来创建管理进程
2. ThreadPoolExecutor来创建线程池管理

线程安全与锁优化:

Java语言中的线程安全:final关键词带来的可见性
相对的线程安全:互斥同步(Synchronization),重入锁(ReentrantLock)
ReentrantLock锁相对增加的一些高级功能:等待可中断,公平锁,锁绑定多个条件
虚拟机锁优化:
- 自旋锁与自适应自旋锁
- 锁消除
- 锁粗化
- 轻量级锁
- 偏向锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值