안전하지 않은 것은 Java Lock-Free 작동의 초석이며, 잠금없는 동시성 클래스에는 없어서는 안될 것입니다. 예를 들어, ConcurrenThashMap 및 ConcurrentLinkedqueue는 모두 안전하지 않은 클래스에서 구현됩니다. Java의 자물쇠와 비교하여 기본적으로 오버 헤드가 없으며 제자리에 대기합니다. 이 기사는 주로 안전하지 않은 주요 작업을 소개합니다.
1 비교
/*** OBJ의 오프셋과 예상 값에서 메모리 위치의 값을 비교하고 동일 한 경우 업데이트하십시오. 이 업데이트는 중단되지 않습니다. ** @param obj 객체 업데이트 해야하는* @param 오프셋 OBJ* @Param에서 정수 필드의 오프셋을 오프셋하여 필드에서 예상되는 값* @Param 업데이트가 필드의 현재 가치와 동일 할 경우 필드의 현재 가치가 변경되면이 새로운 가치에 제출 된 값을 설정하고, 대상이 된 BOLEANDSWAPINT (OBJECT BOLEANDSWAPINT, INT, INT, INT, INT) 업데이트);
이것은 유명한 CAS 작전이며 세 단계로 나뉩니다.
CAS 패밀리에는 또한 비교 대상 wapobject (), compareandswaplong (), compareandswapint () 등이 포함됩니다.
Atomicinteger의 전형적인 예를 사용하여 다음을 설명하십시오.
public final int getAndadd (int delta) {return unsafe.getAndaddint (this, valueOffset, delta);} // unsafe.getAndadDintPublic Final int getAndaddint (Object var1, long var2, int var4) {int var5; { / ** 원래 값을 얻으십시오* / var5 = this.getIntVolatile (var1, var2); / ** 원래 값이 다른 스레드에 의해 수정되지 않았 음을 확인한 다음 var5 + var4 작동 업데이트*/} while (! this.compareandswapint (var1, var2, var5, var5 + var4)); 반환 var5;}2 POTORDER
/**** 제공된 오브젝트의 지정된 오프셋에서 정수 필드의 값을 주어진 값으로 설정합니다. 이것은 <code> putintvolatile (Object, Long, Int) </code>의 주문 또는 게으른 * 버전으로, 다른 * 스레드로의 변경의 즉각적인 가시성을 보장하지 않습니다. 정수 필드가 * <code> 휘발성 </code> 인 경우에만 유용하므로 예기치 않게 변경 될 것으로 예상됩니다. * * @param obj 수정할 필드가 포함 된 개체입니다. * @param은 <code> obj </code> 내에서 정수 필드의 오프셋을 오프셋합니다. * @param은 필드의 새로운 가치를 평가합니다. * @see #putintVolatile (Object, Long, Int) */ public aviL void potOrderEdint (Object OBJ, Long Offset, int value);
Java에는 메모리 작동이 없기 때문에 OBJ 객체의 오프셋이 값으로 오프셋되는 위치를 수정하십시오.이 안전하지 않은 작동은 불충분 한 메모리 작동을 보완합니다. 또한 많은 사용을 위해 ConsurenthashMap과 같은 배열 작업에도 사용할 수 있습니다.
세그먼트 <k, v> s0 = 새로운 세그먼트 <k, v> (loadfactor, (int) (cap * loadfactor), (hashentry <k, v> []) new Hashentry [cap]); 세그먼트 <k, v> [] ss = (세그먼트 <k, v> []) 새 세그먼트 [ssize]; // 배열이 0 : ss [0] = s0 insafe.putorderedObject (ss, sbase, s0)로 S0을 씁니다. // 세그먼트의 주문 쓰기 [0]
OBJ는 휘발성으로 설정해야한다는 점에 유의해야합니다. 그렇지 않으면 다른 스레드에서는 보이지 않습니다.
3 putxxxvolatile
/**** 휘발성 상점 시맨틱과 함께* 제공된 객체의 지정된 오프셋에서 정수 필드의 값을 주어진 값으로 설정합니다. * * @param obj 수정할 필드가 포함 된 개체입니다. * @param은 <code> obj </code> 내에서 정수 필드의 오프셋을 오프셋합니다. * @param은 필드의 새로운 가치를 평가합니다. */ public Native void putintvolatile (Object OBJ, Long Offset, int 값);
휘발성으로 설정되어야하기 때문에 potorderint와 동일하게 느껴집니다. 그렇지 않으면 사용이 무엇입니까?
위는 이번에 내가 당신과 공유 한 모든 지식 포인트입니다. Wulin.com을 지원 해주셔서 감사합니다.