在我的应用程序中,我需要执行一些长时间运行的任务。我需要可以从具有各自独立生命周期的不同程序组件(尤其是从Android应用程序的“活动”和“服务”组件)以及不同线程访问它。同时,我不需要经常执行此操作,因此,我不想污染内存。因此,我开发了一种自动关闭的Singleton,但不确定是否正确,解决方案也不会出现任何问题。所以我正在寻找一些专业知识。解决方案如下:
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()
。
我的首要任务是唯一性,线程安全性和内存使用率。