只是寻求一些一些确认:Java同步问题
我与Swing GUI服务器对象,包含一方法handle()
,受外部线程访问,而另一种方法doThis()
,这是从服务器对象的运行GUI。
我知道Swing事件处理发生在事件分派线程上,所以它实际上是访问doThis()
的事件分派线程。
有可能是doThis()
和handle()
会导致干扰。为了避免这种情况,我应该让两种方法同步正确吗?这将阻止事件分派线程和其他外部线程在另一个完成之前调用一个方法。
我的推理是否正确?
只是寻求一些一些确认:Java同步问题
我与Swing GUI服务器对象,包含一方法handle()
,受外部线程访问,而另一种方法doThis()
,这是从服务器对象的运行GUI。
我知道Swing事件处理发生在事件分派线程上,所以它实际上是访问doThis()
的事件分派线程。
有可能是doThis()
和handle()
会导致干扰。为了避免这种情况,我应该让两种方法同步正确吗?这将阻止事件分派线程和其他外部线程在另一个完成之前调用一个方法。
我的推理是否正确?
从the Java tutorial on synchronization:
使得这些方法同步有两个作用:第一,它不可能的同一对象来交织上同步方法的两个调用。当一个线程正在执行一个对象的同步方法时,所有其他线程调用同一对象的同步方法块(挂起执行),直到第一个线程完成对象。其次,当一个同步方法退出时,它会自动建立一个与先前同步对象的任何后续调用同步方法的before-before关系。这保证了对所有线程都可见的对象状态的更改。
所以是的。
取而代之,使用SwingWorker
; TwoRoot
就是一个简单的例子。在后台放置handle()
,在process()
放置doThis()
。
本身,这可能不足以在Swing GUI中维护[liveness](http://download.oracle.com/javase/tutorial/essential/concurrency/liveness.html)。 – trashgod