AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77975434
Accepted
banan3'14
banan3'14
Asked: 2024-02-11 11:00:05 +0800 CST2024-02-11 11:00:05 +0800 CST 2024-02-11 11:00:05 +0800 CST

Qual é o getter e setter adequado para propriedades atômicas java

  • 772

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 AtomicBooleandiretamente

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?

java
  • 1 1 respostas
  • 69 Views

1 respostas

  • Voted
  1. Best Answer
    Basil Bourque
    2024-02-11T16:21:53+08:002024-02-11T16:21:53+08:00

    dr.

    👉🏽 Compartilhe o Atomic…contêiner do objeto, não seu valor de carga útil.

    public final AtomicBoolean endOfInputDataSet = new AtomicBoolean( false ) ;
    

    Compartilhe o acesso ao AtomicBooleanobjeto

    Para 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 ao Atomic…próprio objeto.

    Não compartilhe cópias do valor dentro doAtomicBoolean

    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

    private AtomicBoolean endOfInputDataSet;

    Faça isso finalpara evitar que outro AtomicBooleanobjeto seja atribuído para substituir o original.

    E você também pode instanciar na declaração.

    private final AtomicBoolean endOfInputDataSet = new AtomicBoolean( … ) ;
    

    retornar this.endOfInputDataSet;

    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.

    this.endOfInputDataSet = endOfInputDataSet;

    Esta linha estraga seu cenário. Você permite que o programador de chamada substitua seu contêiner.

    retornar this.endOfInputDataSet.get();

    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 um setno contêiner atômico, alterando o conteúdo do contêiner. Você desfez o “Atomic” em AtomicBoolean. 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 AtomicBooleanobjeto pode estar mudando.

    this.endOfInputDataSet.set(endOfInputDataSet);

    Esta linha não é atômica e não é segura para threads, da mesma forma que a linha acima dela.

    por que não é padrão quando o IntelliJ gera o getter e o setter?

    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 finaldiretamente acessível ( publicetc.).

    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.

    • 2

relate perguntas

  • Lock Condition.notify está lançando java.lang.IllegalMonitorStateException

  • Resposta de microsserviço Muitos para Um não aparece no carteiro

  • Validação personalizada do SpringBoot Bean

  • Os soquetes Java são FIFO?

  • Por que não é possível / desencorajado definir um lado do servidor de tempo limite de solicitação?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve