首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件调度线程满足Java内存模型

事件调度线程满足Java内存模型
EN

Stack Overflow用户
提问于 2009-12-05 20:43:20
回答 4查看 562关注 0票数 2

这与我之前问过的一个问题有关,答案是:

如果一个字段是由多个线程访问的,它应该是易失性的或最终的,或者只使用同步块访问。否则,赋值对其他线程可能不可见。

此外,任何操作屏幕上像素的操作都应该从事件调度线程上运行,尽管这是在使用重新绘制/画图时透明地处理的。

因此,根据我的理解,我们需要担心一些简单的东西的内存模型,比如一个精灵在屏幕上移动的动画。

我的问题是,这种理解正确吗? Sun教程示例(如TumbleItem (来源) )不正确吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-06 00:04:59

你知道吗,我觉得你可能说得有道理。TumbleItem代码使用worker.isDone()来确定工作是否已经完成。但是,我不认为这会导致完全的“同步”。

我对JDK1.6代码的解读是,SwingWorker.isDone()使用FutureTask,这反过来又使用带有易失性state属性的Sync对象。isDone()的执行路径似乎不涉及synchronized方法或块。

我并不是新并发类的真正专家,但我认为TumbleItem应该在某个时候调用worker.get(),以保证正确的同步。

编辑:我指的是EDT使用由工作人员填充的img数组。但是,正如@ there所指出的,EDT使用初始化参数也存在问题。

票数 1
EN

Stack Overflow用户

发布于 2009-12-05 22:57:14

典型情况是:

  1. 工作线程做一些计算,并得到一些结果。
  2. 它在事件队列中插入一个事件。
  3. 事件线程检索事件并处理它。
  4. 在此过程中,将访问结果。

在步骤(2)和(3)中进行了适当的同步。这就是为什么步骤(1)中的结果可以在步骤(4)中可见的原因。考虑一下如何实现事件队列,您将看到。

票数 1
EN

Stack Overflow用户

发布于 2009-12-05 23:44:37

当您违反EDT部分时,您可以使用ThreadCheckingRepaintManager来帮助您查找(不是直接回答您的问题,但还是有帮助:-)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1853399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档