Eu tenho uma propriedade booleana atômica em Java
private AtomicBoolean endOfInputDataSet;
Quais são os getter e setter adequados desta propriedade e quais as consequências de cada escolha? Eu posso devolver o AtomicBoolean
diretamente
public AtomicBoolean getEndOfInputDataSet() {
return this.endOfInputDataSet;
}
public void setEndOfInputDataSet(AtomicBoolean endOfInputDataSet) {
this.endOfInputDataSet = endOfInputDataSet;
}
ou posso devolver o desembrulhado boolean
:
public boolean getEndOfInputDataSet() {
return this.endOfInputDataSet.get();
}
public void setEndOfInputDataSet(boolean endOfInputDataSet) {
this.endOfInputDataSet.set(endOfInputDataSet);
}
Acho que a última solução é apenas mais simples para uso pelo cliente e mais limpa, mas por que ela não é padrão quando o IntelliJ gera o getter e o setter?
dr.
👉🏽 Compartilhe o
Atomic…
contêiner do objeto, não seu valor de carga útil.Compartilhe o acesso ao
AtomicBoolean
objetoPara que vários threads sejam coordenados em torno do valor contido na carga útil de um
Atomic…
objeto, os threads devem ter acesso direto simultâneo aoAtomic…
próprio objeto.Não compartilhe cópias do valor dentro do
AtomicBoolean
A emissão de cópias do valor para os vários threads quebra a natureza atômica da interação pretendida pelo uso da
Atomic…
classe. Fazer cópias do valor da carga útil não é seguro para threads, e os threads agora não conseguem se coordenar em torno de um único valor.Detalhes
Faça isso
final
para evitar que outroAtomicBoolean
objeto seja atribuído para substituir o original.E você também pode instanciar na declaração.
Os objetos Atomic… são contêineres que carregam uma carga útil enquanto fornecem acesso seguro a essa carga.
Esta linha retorna uma referência a esse contêiner. O programador chamador pode então obter ou definir o conteúdo dessa carga útil.
Esta linha estraga seu cenário. Você permite que o programador de chamada substitua seu contêiner.
Esta linha retorna uma cópia do conteúdo do seu contêiner.
Esteja ciente de que o método desta linha está retornando “notícias antigas”. Há um intervalo de tempo entre o final da
get()
chamada e o momento em que o programador chamador realmente recebe o valor. Durante essa batida, outro thread pode ter executado umset
no contêiner atômico, alterando o conteúdo do contêiner. Você desfez o “Atomic” emAtomicBoolean
. Este código não é seguro para threads.E há mais tempos entre (a) o método de chamada que recebe nossa cópia retornada do valor da carga útil e (b) o método de chamada que faz uso desse valor. Durante essas batidas adicionais, a carga real de chamada no
AtomicBoolean
objeto pode estar mudando.Esta linha não é atômica e não é segura para threads, da mesma forma que a linha acima dela.
Porque esse código não é seguro para threads .
Ao tentar coordenar vários threads em torno de um único valor, todos esses threads devem lidar simultaneamente com o mesmo valor, o valor transportado como carga dentro do wrapper atômico. Para conseguir isso, todos os threads devem lidar diretamente com o contêiner do wrapper atômico.
Então, você realmente não precisa de métodos de acesso getter/setter aqui. Basta tornar o objeto atômico
final
diretamente acessível (public
etc.).Pense em um grupo de crianças em uma sala de aula tentando coordenar suas atividades em torno de uma mensagem em um envelope. Se você permitir que várias crianças copiem essa mensagem enquanto outras crianças a alteram, você terá um caos. Para coordenar a atividade das crianças, elas devem visualizar simultaneamente a única mensagem contida naquele envelope.