Java 如何阻止sling线程池中的多个线程执行同一语句?
如何防止sling线程池中的线程执行以下语句:serv.getService().start(tic,info); 如果执行已由一个线程完成,则执行多次 我尝试使用一个标志,但似乎没有帮助 日志: 我的代码如下:Java 如何阻止sling线程池中的多个线程执行同一语句?,java,multithreading,aem,Java,Multithreading,Aem,如何防止sling线程池中的线程执行以下语句:serv.getService().start(tic,info); 如果执行已由一个线程完成,则执行多次 我尝试使用一个标志,但似乎没有帮助 日志: 我的代码如下: private void sendBlock( service serv, String tic, Resource block, Update update, Info info, ResourceResolver resolver ) throws
private void sendBlock( service serv, String tic, Resource block,
Update update, Info info, ResourceResolver resolver ) throws
IOException {
private Boolean _alreadyExecuted = Boolean.FALSE;
if( tic != null ) {
String tic = null;
if(!_alreadyExecuted){
getLogger().info("Before startSubmission. Currently _alreadyexecuted is " +_alreadyExecuted);
serv.getService().start( tic, info );
getLogger().info("After startSubmission, _alreadyexecuted is about to change to true. Currently _alreadyexecuted is " +_alreadyExecuted);
_alreadyExecuted = Boolean.TRUE;
getLogger().info("After startSubmission, _alreadyexecuted has been changed to true. Currently _alreadyexecuted is " +_alreadyExecuted);
}
}
}
将该字段更改为
volatile
:
private volatile Boolean _alreadyExecuted = Boolean.FALSE;
在多线程执行环境中,允许线程缓存字段的值(通常是这样)。
volatile
关键字确保所有线程使用分配给字段的当前(相同)值。非常感谢您的快速响应。这对我有用!我知道你的问题已经得到了回答,但是我可以问一下你的用例是什么吗?我从未在AEM项目中遇到使用volatile的需要。在处理作业时,作业线程池中的两个线程执行相同的语句,导致重复的请求。这导致了一个问题。