Совершенно неправильное использование атомарных операций. Метод destroyImpl(), например, может быть вызван многократно. Почему бы вам не воспользоваться классическими блокировками и не избавиться от атомарных сущностей? Так проще и намного читабельней. К тому же вам необходимо работать сразу с несколькими полями — а это нетривиально, если использовать лишь атомарные операции.
Должно получиться что-то вроде этого:
public class Worker {
private boolean destroy;
private boolean destroyed;
private counter;
public void destroy() {
synchronized (this) {
if (this.destroyed) {
return;
}
this.destroy = true;
if (this.counter != 0) {
return;
}
this.destroyed = true;
}
destroyImpl();
}
public void service(String arg) {
synchronized (this) {
if (this.destroy) {
return;
}
++this.counter;
}
serviceImpl(arg);
synchronized (this) {
if (--this.counter != 0) {
return;
}
if (!this.destroy) {
return;
}
this.destroyed = true;
}
destroyImpl()
}
}