Java, Android, потокобезопасная уникальная операция по отношению к памяти - PullRequest
2 голосов
/ 31 марта 2019

В моем приложении мне нужно выполнить какое-то длительное задание. Мне нужно, чтобы он был доступен из разных программных компонентов с их собственным независимым жизненным циклом (в частности, из компонентов «Деятельности» и «Сервис» приложения 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(), когда компонент больше не нуждается в экземпляре.

Мои приоритеты - это уникальность, безопасность потоков и использование памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...