我正在研究使用LDAP服务器作为永久存储的多线程应用程序。我创建了以下服务类来启动和停止LDAP服务需要的时候:在Java中安全地启动/停止服务实例
public class LdapServiceImpl implements LdapService {
public void start() {
if (!isRunning()) {
//Initialize LDAP connection pool
}
}
public void stop() {
if (isRunning()) {
//Release LDAP resources
}
}
private boolean isRunning() {
//What should go in here?
}
}
我们目前使用谷歌吉斯注入服务实现的单一实例:
public class ServiceModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides @Singleton
LdapService providesLdapService() {
return new LdapServiceImpl();
}
}
这样,我们才能在应用程序启动时设置连接池,对连接执行某些操作,然后在应用程序关闭时释放资源:
public static void main(String[] args) throws Exception {
Injector injector = Guice.createInjector(new ServiceModule());
Service ldapService = injector.getInstance(LdapService.class));
ldapService.start();
addShutdownHook(ldapService);
//Use connections
}
private static void addShutdownHook(final LdapService service) {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
service.stop();
}
});
}
我面临的问题是我想确保服务只启动/停止一次。为此,我在服务实现中添加了一个“isRunning()”方法,但我不确定如何实现它。
考虑到应用程序是多线程的,并且我的Service实例是单例,实现“isRunning()”方法的最佳方法是什么?
此外,有没有更好/更干净的方式来实现这一目标?
在此先感谢。
错字:“同步”,但是,这应该工作。我可能会避免使用'isRunning'方法并直接使用标志,但这应该没问题。 –
@KedarMhaswade感谢您指出错字:)而且,isRunning方法完全是多余的,我只是想在原始问题的上下文中展示这个例子。 – djmorton