Java,Android,关于线程的线程安全唯一操作

时间:2019-03-31 09:57:48

标签: java android concurrency singleton

在我的应用程序中,我需要执行一些长时间运行的任务。我需要可以从具有各自独立生命周期的不同程序组件(尤其是从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()

我的首要任务是唯一性,线程安全性和内存使用率。

0 个答案:

没有答案