Inseguro é a pedra angular da operação sem trava Java e é indispensável em classes de simultaneidade sem trava. Por exemplo, o concorrente e o concorrente são implementados pela classe insegura. Comparado com bloqueios em Java, ele basicamente não tem sobrecarga e esperará no lugar. Este artigo apresenta principalmente as principais operações em inseguro.
1 Comparanswap
/*** Compare o valor no local da memória no deslocamento do OBJ e o valor esperado e atualize se o mesmo. Esta atualização não é interrompível. * * @param obj Object that needs to be updated* @param offset The offset of the integer field in obj* @param expect The value that is expected in the field* @param update If the expected value expect is the same as the current value of the field, set the value of filed to this new value* @return If the value of field is changed, return true*/public native boolean compareAndSwapInt(Object obj, long offset, int expect, int atualizar);
Esta é a famosa operação do CAS, que é dividida em três etapas
A família CAS também inclui comparandswapobject (), comparaandswaplong (), comparaandswapint (), etc.
Use um exemplo clássico da AtomicInteger para ilustrar:
public final int getandadd (int delta) {return insefa.GetAndAddInt (isto, valueOffset, delta);} // unsafe.getAndaddIntpublic final int getAndaddint (objeto var1, long var2, int var4) {int var5; do { / ** obtenha o valor original* / var5 = this.getIntVolatile (var1, var2); / ** Confirme que o valor original não foi modificado por outros threads e execute a atualização VAR5 + VAR4 Operação*/} while (! This.compareandswapint (var1, var2, var5, var5 + var4)); retornar Var5;}2 Putorder
/**** Define o valor do campo inteiro no deslocamento especificado no objeto* fornecido para o valor fornecido. Esta é uma versão ordenada ou preguiçosa * de <code> putIntvolatile (objeto, long, int) </code>, que * não garante a visibilidade imediata da alteração para outros threads *. É realmente realmente útil quando o campo inteiro é * <code> volátil </code> e, portanto, espera -se que mude inesperadamente. * * @param obj o objeto que contém o campo para modificar. * @Param Offset O deslocamento do campo inteiro dentro de <code> obj </code>. * @param valor o novo valor do campo. * @See #putIntVolatile (objeto, longo, int) */ public nativo void putorderedInt (objeto obj, deslocamento longo, int valor);
Modifique a posição em que o deslocamento do objeto OBJ é deslocado para o valor, porque não há operação de memória em Java, e essa operação de inseguro apenas suplementa a operação de memória insuficiente. Ele também pode ser usado para operações de matriz, como o concorrente para um grande número de uso
Segmento <k, v> s0 = novo segmento <k, v> (loadFactor, (int) (cap * loadFactor), (hashentry <k, v> []) nova hashentry [cap]); Segmento <k, v> [] ss = (segmento <k, v> []) novo segmento [ssize]; // escreva S0 na posição em que a matriz é subscrita para 0: ss [0] = s0 insefa.putOrderEdObject (ss, sbase, s0); // Escrita ordenada de segmentos [0]
Deve -se notar que o OBJ precisa ser definido como volátil, caso contrário, será invisível para outros threads.
3 putxxxxvolatile
/**** Define o valor do campo inteiro no deslocamento especificado no objeto* fornecido para o valor fornecido, com a semântica do armazenamento volátil. * * @param obj o objeto que contém o campo para modificar. * @Param Offset O deslocamento do campo inteiro dentro de <code> obj </code>. * @param valor o novo valor do campo. */ public nativo void putIntVolatile (objeto obj, deslocamento longo, valor int);
Parece o mesmo que PutorderInt, porque deve ser definido como volátil, caso contrário, qual é o uso?
O exposto acima é todos os pontos de conhecimento que compartilhei com você desta vez. Obrigado pelo seu apoio ao wulin.com.