线程资源同步分析

12 篇文章 0 订阅

首先看个例子:

int i=0;

public int getNextId(){

return i++;

}

接下来分析一下JVM中执行步骤

1.JVM首先在main memory(JVM堆)给i分配一个内存存储场所,并存储其值0;

2.线程启动后,会自动分配一片working Memory 区(通常是操作数栈),当线程执行到return i++时,JVM中并不是简单的一个步骤就可以完成的,i++ 动作在JVM中分为装载i, 读取i, 进行i++ 操作,存储i及写入i五个步骤。

装载

线程发起一个装载i的请求给JVM线程执行引擎,引擎接收后会向main memory发起一个read i的指令

当read i 执行完毕后,一段时间会将i的值从main memory 区复制到working memory区中。

读取i

此步负责的时从main memory中读取i 

进行i+1操作

此步由线程完成

存储i

将i+1的值赋值给i,然后存储到working memory 中。

写入i

一段时间后i的值会写回到main memory 中。


从以上步骤描述来看,这里面最关键的问题有两点:一是working Memory中i的值和main memory中i值的同步是需要时间的;二是i++由多个操作组成。只要多个线程在这个时间段内同时执行操作,就会出现获取i值相同的现象。


JVM把对于working memory的操作分为 use , assign ,load,store,lock,unlock. 对于working Memory操作的指令由线程发出,对于main memory的操作分为read ,write,lock,unlock;对于main memory 的操作指令由线程执行引擎发出,其含义本别为:

use

use 由线程发起,需要完成将变量的值从working memory 中复制到线程执行引擎中。

assign

assign由线程发起,需要完成将变量值复制到线程的working memory中,例如:a=i,这时线程就会发起一个assign动作。

load

load由线程发起,需要完成将main memory 中read 到的值复制到working memory中。

store

store 由线程发起,负责将变量的值从working memory 中复制到main memory 中,并等待 main memory 通过write 动作写入此值。

write

write由main memory 发起,负责将working memory 的值写入到main memory 中。

lock

lock动作由线程发起,同步操作main memory,给对象加上锁。

unlock

unlock动作由线程发起,同步操作main memory,去除对象的锁。

JVM中保证以下操作是顺序的。

1.同一个线程上的操作一定是顺序执行的;

2.对于main memory 上的同一个变量的操作一定是顺序执行的,也就是不可能两个请求同时读取变量值;

3.对于加了锁的main memory上的对象操作,一定是顺序执行的,也就是两个以上加了lock的操作,同时只有一个是在执行的。

为了避免资源操作的脏数据问题,JVM提供了synchronized 关键字,volatile关键字,lock/unlock机制.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值