我想知道Jython的内存模型如何应用于创建Java Swing应用程序。
为了避免thread interference和memory inconsistency错误,大多数图形用户界面代码都运行在事件分派线程上。
但是,Jython内存模型可以防止内存不一致错误,因为所有变量都是易失性的。Jython中的原子操作减少了线程干扰。
这个Jython concurrency chapter说明,“读取或替换单个实例属性”是一个原子操作。这也适用于Jython中使用的Java对象吗?
Jython的内存模型是否改变了在Swing应用程序中处理并发的方式?
发布于 2016-03-16 09:46:14
Jython的内存模型属性可能在很小程度上减少了线程干扰,但线程干扰的大部分问题仍然存在。我主要指的是数据结构的一致性。这会影响几乎所有包含不同数量项的数据结构。例如,要附加到ArrayList,可能需要在幕后执行一些操作:检查当前大小和分配的空间(如果用完,可能分配更多的空间),在结束后的下一个单元格处分配一个引用,并递增大小变量。或者,在有间隙的缓冲区中,插入字符可能需要几个变量,这些变量指定间隙所在的位置,并在必须移动间隙的情况下复制大量引用。每个操作可能是原子的,但是如果线程在此操作序列的中间被切换,则在原始线程返回以完成数据结构修改操作之前,从试图读取或写入数据结构的任何其他线程的角度来看,数据结构将看起来是损坏的。Swing肯定会使用这些数据结构,当然还有很多其他数据结构。
顺便说一下,这是关于原子性的一个很好的观点。事实证明,引用赋值在Java语言中也是原子操作,但在从Java语言中读取long和double时要小心,因为writing these 64-bit primitives on 32-bit architectures is not necessarily atomic (即可能只编写了一半)。在Jython中,这不是问题,因为所有变量都是volatile。
https://stackoverflow.com/questions/29041109
复制相似问题