如何使Java类对XPages线程安全

如何使Java类对XPages线程安全,java,xpages,Java,Xpages,我正在编写(从LS重新编写)一个公共函数的Java库,例如,将用户添加到Domino目录中的组的方法。在LotusScript中,这是在代理/脚本库中完成的,并且并发代理没有打开。因此,如果两个用户调用该方法将一个用户添加到同一个组中,我不必担心保存冲突 在XPages中,它们可以并发运行。因此,我想知道什么是限制该方法以使其线程安全的最佳实践。我最初认为我不打算使用托管bean,因为我不保存任何信息,只是调用此方法将用户添加到组中。但是,我可以看到,如果同时运行该方法以将用户添加到同一组中,则

我正在编写(从LS重新编写)一个公共函数的Java库,例如,将用户添加到Domino目录中的组的方法。在LotusScript中,这是在代理/脚本库中完成的,并且并发代理没有打开。因此,如果两个用户调用该方法将一个用户添加到同一个组中,我不必担心保存冲突

在XPages中,它们可以并发运行。因此,我想知道什么是限制该方法以使其线程安全的最佳实践。我最初认为我不打算使用托管bean,因为我不保存任何信息,只是调用此方法将用户添加到组中。但是,我可以看到,如果同时运行该方法以将用户添加到同一组中,则可能存在保存冲突


有没有关于如何最好地防止这种情况的建议?使用应用程序范围的托管bean并在方法运行时设置标志?或者我应该通过调用save(false,false)来处理这个问题,这样我的文档保存就会失败,我的代码中有逻辑可以重试吗?或者,还有其他最佳实践可供使用吗?

我想到了两种方法。首先是使用
synchronized
关键字来使用Java的内部机制。如果您不希望有太多重叠,但希望有一个保护措施,那么这是非常好的

第二种方法需要更多的努力,并且只在有大量并发操作时才需要:不要执行该操作,而是将其添加到队列对象中,并在该队列中使用单独的威胁


您可能想了解一下

,因此,只需将synchronized添加到我的方法(不经常看到并发操作)就可以为一个普通的旧Java对象(而不是bean)的同一XPage的多个用户做到这一点?我知道这对Java程序很有效,但我不确定每个用户在运行相同的XPage时如何生成自己的线程……这是http servlet的基础。每个请求都会进入自己的线程是的,这就是为什么我问同步的线程是否会在XPages生成的多个线程上同步?我在方法“public synchronized static boolean addUserToGroup(..”中添加了synchronized。为了测试它,我在方法中加入了一个sleep语句,并在方法的开始和结束处添加了一个print stmt。然后,我在两个不同的浏览器中从两个不同的XPage中尝试了它,然后一个接一个地启动。对该方法的第二次调用一直等到它为第一个XPage提供服务,证明它有效!!!相同XPage的结果相同,但是不同的浏览器。谢谢Stephan!