В моем приложении мне нужно выполнить какое-то длительное задание. Мне нужно, чтобы он был доступен из разных программных компонентов с их собственным независимым жизненным циклом (в частности, из компонентов «Деятельности» и «Сервис» приложения Android), а также из разных потоков. В то же время мне не нужно, чтобы эта операция выполнялась слишком часто, поэтому я не хочу загрязнять память. Поэтому я разработал какой-то синглтон с автоматическим закрытием, но я не уверен, что сделал все правильно, и с моим решением проблем не возникнет. Поэтому я ищу опыт. Решение выглядит так:
public class UniqueOperation {
private static volatile UniqueOperation instance = null;
private static final Object lock = new Object();
private volatile int connections;
private volatile boolean isRunning;
private UniqueOperation() {}
public static UniqueOperation getInstance() {
synchronized (lock) {
if (instance == null) {
instance = new UniqueOperation();
}
instance.connections++;
}
return instance;
}
public void requestWork() {
synchronized (lock) {
if (isRunning) {
return;
} else {
isRunning = true;
}
}
doWork();
synchronized (lock) {
isRunning = false;
if (connections < 1) {
instance = null;
}
}
}
private void doWork() {
try {
Thread.sleep(TimeUnit.MINUTES.toMillis(2));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public boolean isRunning() {
synchronized (lock) {
return isRunning;
}
}
public void close() {
synchronized (lock) {
connections--;
if (connections < 1 && !isRunning) {
instance = null;
}
}
}
}
Любой компонент, который получил экземпляр, должен вызывать close()
, когда компонент больше не нуждается в экземпляре.
Мои приоритеты - это уникальность, безопасность потоков и использование памяти.