У меня есть следующий класс:Разрешить только один поток в то время, чтобы использовать объект
public class MyClass{
private List<Integer> ints = new LinkedList<Integer>();
public List<Integer> getInts(){
return ints;
}
public synchronized void doAction(){
//Do some with the list
}
}
мне нужно, чтобы только один поток в то время в виде доступа к List
. Я хотел бы сделать это следующим:
public class MyClass{
private List<Integer> ints = new LinkedList<Integer>();
private static final Semaphore s = new Semaphore(1);
public List<Integer> getInts(){
s.acquire();
return ints;
}
public void release(){
s.release();
}
public synchronized void doAction(){
s.acquire();
//Do some with the list
s.release();
}
}
Но implementaion, очевидно, не является надежным, потому что, если запрос клиента по List
через геттер для добавления некоторых элементов в ней и забыть вызвать release()
мы получим в неприятности, если это попробуйте вызвать метод doAction
.
Какое решение проблемы?
Kayaman имеет правильный ответ здесь, но и в будущем, если вы думаете, что вы хотите использовать 'Semaphore' таким образом, рассмотреть возможность использования' java.util.concurrent.Lock' вместо этого. –