sto*_*gek 2 java concurrency multithreading atomicity
首先引自From JLS 8 Sec 17.7
无论是否将它们实现为32位或64位值,对引用的写入和读取始终是原子的.
这是让我感到困惑的场景,给定Employee类和此类中名为calculate的方法,该方法返回对Employee实例的引用.
Employee emp = calculate();
Run Code Online (Sandbox Code Playgroud)
当对变量的写入是原子时,这意味着在原子操作完成之前没有其他线程可以访问该变量,并且在给定的赋值示例中,写入的原子性包括对赋值右侧的评估(但是复数),或者写入的原子性是否仅适用于完全评估右侧的情况,然后实际完成写入操作.
换句话说,我问的是,在评估过程中calculate(),emp对其他线程的访问权限是否被拒绝,或者仅在分配的右侧被完全评估并且写入操作emp开始时才被拒绝?
对不起,很长一段时间,非常感谢!
写入的原子性意味着当你准备好存储的值时,写入将以每个线程(1)读取前一个值或(2)读取新值,但从不做某事的方式完成损坏.在您的情况下,执行语句的逻辑
emp = calcluate();
Run Code Online (Sandbox Code Playgroud)
可以分为两个步骤:
calcluate方法并获取值; 我们称之为val.val成emp.这意味着如果你试图emp在calculate函数仍在进行时读取(或者在它返回之间的时间段和尚未写入的值之间的狭窄时间段内),你将获得已经存在的任何值emp.其他线程不会被阻止读取它.如果你想这样做,你需要使用一些显式同步.
(作为一个注释 - 原子性并不意味着"所有其他线程将被阻塞,直到值准备好."这意味着"所有其他线程将在操作完成之前或仅在操作完成后纯粹看到状态,但没有其他.")