Definição de campos em ambiente concorrente

Developer87:

Eu tenho dois métodos em minha classe, que será executado dentro do ambiente concorrente:

class Clazz {

  private int counter = 0;
  private volatile Map<..> map = new ConcurrentHashMap<>();
  private int[] array;

  public void concurrentMethod() {
    ...perform some actions with map...
  }

  public int nonConcurrentMethod() {
    ...reinitialize the map...change references...
    counter++;
    return array[counter];
  }

}

A questão é o seguinte: assumindo que nonConcurrentMethodestá a ser chamado por apenas um thread por vez, devo especificar explicitamente countere arraycomo um volatilecampo? Faça balcão atomic?

Meus pensamentos são que seria melhor para garantir que tudo deve funcionar sem falhas em uma produção real.

Charles Dowbecki:

Geralmente é toda a classe que tem a semântica específicos thread-safe por exemplo, HashMapnão é thread-safe, enquanto ConcurrentHashMapé. Isto é especialmente importante se você está construindo uma biblioteca, as pessoas podem ir ao redor seu projeto chamando nonConcurrentMethod()de vários segmentos.

IMO, se você não pode dividir Clazz-se em duas classes distintas com diferentes semântica thread-safe seria prudente fazer nonConcurrentMethod()thread-safe. No caso nonConcurrentMetho()é chamado de vários segmentos do desempenho irá degradar, mas a correção será mantido, espero evitando difícil encontrar bugs.

Pode tentar um bloqueio interno, que esperamos que não será demasiado caro devido ao bloqueio inclinado optimizá-la quando o bloqueio é obtido a partir de um único segmento:

private final Object lock = new Object();

public int nonConcurrentMethod() {
  synchronized(lock) {
    ...reinitialize the map...change references...
    counter++;
    return array[counter];
  }
}

Certifique-se de que pelo menos um dos Clazzcampos é finalpara garantir a publicação segura .

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=195565&siteId=1
Recomendado
Clasificación