All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.vipcxj.jasync.ng.runtime.schedule.DisposableHandler Maven / Gradle / Ivy

package io.github.vipcxj.jasync.ng.runtime.schedule;

import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

import io.github.vipcxj.jasync.ng.spec.JDisposable;

public class DisposableHandler implements JDisposable {

    private static final JDisposable FAKE_DISPOSABLE = new DummyDisposable();
    private volatile JDisposable disposable = null;
    private volatile boolean disposed = false;
    private static final AtomicReferenceFieldUpdater DISPOSABLE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(DisposableHandler.class, JDisposable.class, "disposable");


    static class DummyDisposable implements JDisposable {

        @Override
        public void dispose() {
            throw new UnsupportedOperationException("Unimplemented method 'dispose'");
        }

        @Override
        public boolean isDisposed() {
            throw new UnsupportedOperationException("Unimplemented method 'isDisposed'");
        }
    }

    public void updateDisposable(JDisposable disposable) {
        if (!DISPOSABLE_UPDATER.compareAndSet(this, null, disposable)) {
            if (this.disposable == FAKE_DISPOSABLE) {
                disposable.dispose();
            }
        }
    }

    @Override
    public void dispose() {
        while (this.disposable != FAKE_DISPOSABLE) {
            if (DISPOSABLE_UPDATER.compareAndSet(this, null, FAKE_DISPOSABLE)) {
                this.disposed = true;
                return;
            } else {
                JDisposable disposable = this.disposable;
                if (disposable != FAKE_DISPOSABLE) {
                    if (DISPOSABLE_UPDATER.compareAndSet(this, disposable, FAKE_DISPOSABLE)) {
                        disposable.dispose();
                        this.disposed = true;
                        return;
                    }
                }
            }
        }
    }

    @Override
    public boolean isDisposed() {
        return disposed;
    }
    
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy