我有一个实现Runnable
的类,并提供了其他字段来存储线程的当前自定义UI
实例(扩展了UI
类)。
在内部调用的run
方法中
@Override
public void run() {
ui.access(() -> ui.getPoolingManager().unregisterPollRequest(this));
}
其中ui
是在线程实例化时设置的当前线程的字段。
问题-使用相同的ui
实例在labmda内部调用access
和getPoolingManager
(自定义方法)时,是否存在一些并发问题?
答案 0 :(得分:1)
除非PoolingManager本身使用ThreadLocals或类似的我不这么认为。您可以通过访问方法在UI实例上保持锁定,因此访问其他字段/方法毫无问题。
来自documentation:“给定的runnable在持有会话锁的同时执行,以确保对该UI的独占访问。如果会话未锁定,则将获取该锁,并且该runnable立即运行。如果会话当前处于锁定状态,则可运行的对象将在释放该锁定之前运行。”和“请注意,可运行对象可能在其他线程上调用,或者稍后在当前线程上调用,这意味着自定义线程本地执行命令时可能没有期望的值。”