복붙노트

[SPRING] ConcurentHashMap과 AtomicInteger를 스프링 서비스 클래스 내의 인스턴스 변수로 사용하기

SPRING

ConcurentHashMap과 AtomicInteger를 스프링 서비스 클래스 내의 인스턴스 변수로 사용하기

컨트롤러에 주입 된 싱글 톤 스프링 서비스 내에서 ConcurentHashMap의 스레드 안전 사용법을 구현하려고합니다.

@Service
public MyService{

  final ConcurrentMap<String, AtomicInteger> myMap = new ConcurrentHashMap<String,   AtomicInteger>(10) {
        {/* initialize the ten key/values */
        }
    };

 public int add(String key) {
   return myMap.get(key).incrementAndGet();
 }

    // accessed via ajax loop (and controller), if value changes update display
  public int getCount(String key) {
    return myMap.get(key).get();
  }
}

thread-safe 해시 맵에 액세스하는 더 좋은 방법이 있습니까? 클러스터 환경에서이 작업을 어떻게 적용 할 수 있습니까? 그것은 내 다른 질문에 대한 내용이다.

해결법

  1. ==============================

    1.나는 esp에 대한 해답을 얻는 것을 목표로하지 않는다. 나는 군집 된 상황에 대한 전문 지식이 없기 때문에; 그러나 나는 주목할 가치가 있다고 생각하는 것을 지적하고자한다.

    나는 esp에 대한 해답을 얻는 것을 목표로하지 않는다. 나는 군집 된 상황에 대한 전문 지식이 없기 때문에; 그러나 나는 주목할 가치가 있다고 생각하는 것을 지적하고자한다.

    주석 중 하나 인 @JB Nizet은 코드가 스레드로부터 안전하고 정확하다는 점을 언급합니다. Java API Reference를 기반으로 일관성이 없지만 추가하고 싶습니다.

    일부 업데이트가 현재 실행 중일 때 클라이언트가이 정보를 얻을 수 있음을 의미합니다. 그리고 그것은 여러분의 코드에서 '루핑'을 언급 한 이후로 의미가 있습니다. 그래서, 이것이 중요하지 않다면 모든 것이 잘되어야합니다.

    하지만이 작업을 좀 더 엄격하게해야한다면 ReentrantReadWriteLock 인스턴스를 사용하는 것이 좋은 선택 일 것이라고 생각했습니다. 잠금을 사용하면 사용 가능한 정보의 일관된 스냅 샷이있을 때까지 코드가 모든 읽기 요청을 차단할 수 있습니다. add 메소드가 코드에서 사용 된 맵의 일관된 스냅 샷을 기다리는 모든 잠금을 해제 할 때까지 getCount 메소드의 잠금을 사용하여 엄격하게 차단할 수 있습니다.

    또한 클러스터 된 솔루션으로 마이그레이션 할 때 동일한 관심사가 유효하다고 생각할 수 있습니다. 서로 다른 클러스터 노드간에 일관성이 요구되는 경우이를 처리해야합니다.

  2. from https://stackoverflow.com/questions/11126684/using-concurenthashmap-and-atomicinteger-as-instance-variables-within-a-spring-s by cc-by-sa and MIT license