执行引擎使用这个变量前需要从新执行load或assign操作初始化变量的值,不太明白

来源:1-5 JAVA内存模型

anxiouspig

2019-06-24

如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要从新执行load或assign操作初始化变量的值

假如加锁后没有执行load,执行assign之后工作内存应该还是用锁之前的值计算之后出来的值啊?
然后在unlock时,再把工作内存的值同步到主内存中,那么不就覆盖了加锁的线程同步到主内存的值了么?
老师这块不太明白

写回答

1回答

Jimin

2019-06-24

你好,根本上来说不存在这种假设,这里的要求属于针对底层实现做的,我们上层调用时是感知不到的,因此也无法在调用时去掉其中某一步。
这个规则是JMM提出的,根本上针对JDK实现时必须遵守这些规则(如果JDK提供的类不遵守这些规则,那么就没任何规则可言了,我们讨论并发等就相当于没了理论依据),有了这些规则,我们在后面做线程安全分析及处理时,才能称得上有理有据。但是上层的类在实现及调用不同,依旧会产生不同的问题,这就需要我们具体了解每个关键字的特性,比如synchronized、volatile。我们再谈论每个关键字或类有某些特性时,其实也是满足了这些基础规则之后的基本扩展,这些规则其实是限制了这些类在编译成机器码时必须是满足JMM要求。

0
6
Jimin
一个变量一旦被锁,其他线程就不能操作了,属于同步阻塞在那里,就类似于synchronized锁代码块这种,其他线程都阻塞在那里,等待锁被释放后争夺到锁才可以继续
2019-06-25
共6条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程