什么Lock不可重入,即如果在先前没有释放的情况下在相同的线程中获取了块?

时间:2013-12-23 12:03:08

标签: java multithreading thread-safety locking

当我在主线程中单击Button1我想要tryLock()然后启动后台任务时。后台任务将在完成后将unlock()发布到主线程。如果未获取锁定,则单击应该不执行任何操作并返回。我不想在后台任务的线程中锁定,因为初始化任务对象很昂贵。如果已经通过上一次按钮点击获取了锁,我想完全避免创建一个任务对象。

如果Button2的任务尚未完成,tryLock()Button1应该会失败。由于两个按钮都从同一个线程锁定,因此重入锁定不起作用。

由于只能从主线程获取和释放锁定,解决方案只是一个private boolean类成员吗?它甚至必须是volatile吗?

1 个答案:

答案 0 :(得分:2)

如果阻止GUI线程,则无法点击任何内容。不要使用锁。

简单明了boolean就可以了。

您需要做的就是将boolean设置为false,调用SwingWorker,然后在true方法中将其重置为done。由于在EDT上调用done方法,您将从EDT启动SwingWorker,因此没有线程要求。

在您说后台任务将发布unlock() 的问题中,根据其工作原理,您可能需要使用volatile boolean

如果您想要从后端分离前端,最好使用类似Model View Presenter模式的内容,并在演示者myControlsEnabled(boolean enabled)中使用interface方法。用户启用不执行任何操作的GUI控件永远不会很好......