У меня есть класс, который содержит статическое поле, которое действует как синглтон:
public class A {
private static MyAPI instance = null;
protected synchronized static MyAPI getAPI() throws Exception {
if (instance == null){
// init API;
}
return instance;
}
// other methods
}
И у меня есть несколько классов, которые наследуются от класса A и должны выполнять действия с API. Я работаю в многопоточной среде, и API может работать по одному за раз, поэтому я должен убедиться, что все подклассы не работают в API одновременно. Для этого я синхронизирую суперкласс при доступе к API в подклассах:
public class B extends A {
public void myMethod(){
synchronized (A.class) {
myAPI = getAPI();
// do stuffs with myAPI
}
}
}
В этом решении я блокирую весь класс, а не только экземпляр API, поэтому другие методы моего класса A недоступны, когда подкласс работает с API и производительность может быть уменьшена.
Как вы думаете, это лучшее решение или вы знаете лучший способ?
Спасибо.