我正在研究使用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