A principal pesquisa deste artigo é o conteúdo relevante do uso do ConcurrentMap.putIfAbsent(key,value) , como segue.
Esse tipo de cenário é frequentemente encontrado nos negócios. Um mapa simultâneo simultâneo é mantido globalmente. Cada chave do mapa corresponde a um objeto, e esse objeto precisa ser criado apenas uma vez. Se o valor correspondente à chave no mapa não existir, ele será criado, caso contrário, será retornado diretamente.
Vejamos o código primeiro:
public static loce getInstance (linguagem de string, string country, string variant) {// ... string key = algum_string; Loce loce = map.get (chave); if (Locale == NULL) {Locale = New Locale (idioma, país, variante); map.put (chave, localidade); } retornar localidade; } O que esse código precisa fazer é:
Esperamos que cada vez que o método GetInstance seja chamado, devemos garantir que a mesma chave retorne a mesma referência de objeto local. Este código pode alcançar esse requisito?
A resposta é: os requisitos podem ser atendidos em um ambiente de thread único, mas haverá problemas de segurança de threads em um ambiente multithread, ou seja, não é garantido que a mesma chave na concorrência retorne a mesma referência de objeto local.
Isso ocorre porque existe um hábito no código acima chamado operação PUT-IF-ACSENT [1], e esta operação tem uma condição de corrida:
if (Locale == NULL) {Locale = New Locale (idioma, país, variante); map.put (chave, localidade); } Porque depois que um thread terminou de julgar a localidade == NULL, é verdade que valoriza o mapa. Outros threads já podem ter feito operações de colocar no mapa. Ao fazer as operações de colocar novamente, o objeto de localidade correspondente à mesma chave é substituído e, finalmente, a referência do local da mesma chave retornada pelo método GetInstance será inconsistente. Portanto, a operação de put-if-absent no mapa não é segura (thread segura).
Para resolver esse problema, o Java 5.0 introduziu a interface ConcurrentMap, onde existe a operação put-if-ausnt na forma de um método atômico putIfAbsent(K key, V value) . Como Javadoc escreve:
Ao adicionar um par de valores-chave ao concorrente, primeiro determinará se o par de valores-chave já existe.
Revise o método acima:
public static loce getInstance (linguagem de string, string country, string variant) {// ... string key = algum_string; Loce loce = map.get (chave); if (Locale == NULL) {Locale = New Locale (idioma, país, variante); map.putifabsent (chave, localidade); } retornar localidade; } Este código usa a forma simultânea de mapa (ConcurrentMap, ConcurrentHashMap) e simplesmente usa o map.putIfAbsent(key, locale) . Isso também não garante que a mesma chave retorne a mesma referência de objeto de localidade.
O erro aqui é que o método putifabsent tem um valor de retorno e o valor de retorno é importante.
Portanto, ao usar o método putifabsent, lembre -se de julgar o valor de retorno.
public static loce getInstance (linguagem de string, string country, string variant) {// ... string key = algum_string; Loce loce = map.get (chave); if (Locale == NULL) {Locale = New Locale (idioma, país, variante); Localidade tmp = map.putifabsent (chave, localidade); if (tmp! = null) {loce = tmp; }} retornar loce; } importar java.util.map; importar java.util.concurrent.concurrenthashmap; public class Test {public static void main (string [] args) {// teste CurrentHashMap.putifabsent () mapa <long, string> clientMap = newnCapurrentHashMap <> (); system.out.out.out.print.print. primeiro "); system.out.println (" clientmap: " + clientmap); system.out.println (); // Adicione um novo registro no string sitmmap em vazio.out.println (" Adicione um novo registro no cliente vazio "; clientmap.putifabsent (netId, str1); system.out.println ("Adicione um cliente anterior:" + clientmap); system.out.println ("View Return Value Result:" Result); SystemM.out.println (); // repetir system.out.println ("repetir" system.); Result2 = clientmap.putifabsent (netId, str1); System.out.println ("Após adicionar clientmap:" + clientmap); System.out.println ("View Return Value Result:" + Result2); System.out.println ();}}}O exposto acima é o conteúdo inteiro deste artigo sobre o exemplo de uso do concurrentmap.putifabsent (chave, valor) e espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!