이 기사의 주요 연구는 다음과 같이 ConcurrentMap.putIfAbsent(key,value) 의 사용의 관련 내용입니다.
이러한 종류의 시나리오는 종종 비즈니스에서 발생합니다. 동시 동의 맵은 전 세계적으로 유지됩니다. 맵의 각 키는 객체에 해당 하며이 객체는 한 번만 만들어야합니다. 지도의 키에 해당하는 값이 존재하지 않으면 생성됩니다. 그렇지 않으면 직접 반환됩니다.
먼저 코드를 살펴 보겠습니다.
public static locale getinstance (문자열 언어, 문자열 국가, 문자열 변형) {// ... String key = some_string; 로케일 로케일 = map.get (키); if (locale == null) {locale = new Locale (언어, 국가, 변형); Map.put (키, 로케일); } 리턴 로케일; } 이 코드가해야 할 일은 다음과 같습니다.
GetInstance 메소드가 호출 될 때마다 동일한 키가 동일한 로컬 객체 참조를 반환해야합니다. 이 코드 가이 요구 사항을 달성 할 수 있습니까?
답은 단일 스레드 환경에서 요구 사항을 충족 할 수 있지만 다중 스레드 환경에는 스레드 안전 문제가있을 것입니다.
위의 코드에는 put-if-absent 작동 [1]이라는 습관이 있기 때문입니다.이 작업은 레이스 조건이 있습니다.
if (locale == null) {locale = new Locale (언어, 국가, 변형); Map.put (키, 로케일); } 스레드가 Locale == NULL 판단을 마친 후에도 맵에 값을 넣는 것이 사실입니다. 다른 스레드는 이미지도에 작업을 수행했을 수 있습니다. 작업을 다시 수행 할 때 동일한 키에 해당하는 로케일 객체가 덮어 쓰고, 마지막으로 GetInstance 메소드에 의해 반환 된 동일한 키의 로케일 참조는 일관되지 않습니다. 따라서지도에서 Put-If-Absent 작업은 안전하지 않습니다 (스레드 안전).
이 문제를 해결하기 위해 Java 5.0은 풋 -if-absent 작동이 원자 메소드 putIfAbsent(K key, V value) 의 형태로 존재하는 동의 맵 인터페이스를 도입했습니다. Javadoc이 쓴대로
ConcurrEthashMap에 키 값 쌍을 추가 할 때 먼저 키 값 쌍이 이미 존재하는지 여부를 결정합니다.
위의 방법을 수정하십시오.
public static locale getinstance (문자열 언어, 문자열 국가, 문자열 변형) {// ... String key = some_string; 로케일 로케일 = map.get (키); if (locale == null) {locale = new Locale (언어, 국가, 변형); map.putifabsent (키, 로케일); } 리턴 로케일; } 이 코드는 동시 형태의 맵 (ConcurrentMap, ConcurrEthashMap)을 사용하며 간단히 map.putIfAbsent(key, locale) 사용합니다. 또한 동일한 키가 동일한 로케일 객체 참조를 반환한다고 보장하지는 않습니다.
여기서 오류는 putifabsent 메소드에 리턴 값이 있고 반환 값이 중요하다는 것입니다.
따라서 putifabsent 방법을 사용할 때는 반환 값을 판단해야합니다.
public static locale getinstance (문자열 언어, 문자열 국가, 문자열 변형) {// ... String key = some_string; 로케일 로케일 = map.get (키); if (locale == null) {locale = new Locale (언어, 국가, 변형); 로케일 tmp = map.putifabsent (키, 로케일); if (tmp! = null) {locale = tmp; }} 리턴 로케일; } import java.util.map; import java.util.concurrent.concurrenthashmap; public class test {public static void main (string [] args) {// test currentHashMap.putifAbsent () map <long, string> clientMap = new ConsurenThashMap <> (); System.out.println ( "empty clientmap 인쇄. 첫 번째 "); system.out.println ("clientMap : " + clientMap); system.out.println (); // 빈 클라이언트 맵 System.out.println ("빈 클라이언트 맵에서 새 레코드 추가 "; System.out.println ("이전 ClientMap 추가 : " + clientMap); long netid = 1234567L = 1234567L ="; ClientMap.putifabsent (netID, str1); System.out.println ( "이전 ClientMap 추가 :" + ClientMap); System.out.println ( "반환 값보기 :" + result); System.out.println (); // system.out.println ( "마지막 레코드 반복"); result2 = clientMap.putifAbsent (netID, str1); System.out.println ( "ClientMap을 추가 한 후 :" + clientMap); System.out.println ( "반환 값 value result :" + result2); system.out.println ();}}위의 내용은 ConcurrentMap.putifabsent (키, 값)의 사용 예제에 대한이 기사의 전체 내용이며 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!