>  Q&A  >  본문

java - HashMap中在项目中不用锁,使用什么方法可以把他改造成线程安全的?

在java中,Hashmap是线程不安全的,通过锁的机制和粒度,在源码中提供了HashTable和ConcurrentHashMap两种数据结构供使用,但是如果不使用锁,有什么方法将HashMap做到再业务中是线程安全的呢?

==========================================================================

我有一种思路是这样的:首先有一个map,再使用它的时候,将他赋值给一个新的map,我们叫他map',然后再将该map'做为key,存成一个新map。新map为Map<map',value>,这样每次添加的时候,是基于map'来添加的?

各路大神,还有没有其他思路呢?大家一起来讨论讨论哈。

PHPzPHPz2764일 전525

모든 응답(6)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-18 09:50:14

    포스터에서 언급한 방법은 CopyOnWrite 작업 중에 복사본을 만드는 것이 주요 아이디어인데, JDKCopyOnWriteArrayList을 참고하시면 됩니다. 복사를 사용할 때 작업을 잠글 필요가 없습니다. 왜냐하면 잠기지 않은 경우 최종 데이터를 다시 병합하는 것이 골치 아픈 일이 되기 때문입니다(즉, set일 때 잠그어야 함을 의미)merge

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-18 09:50:14

    공유 데이터는 잠금 없이 스레드로부터 안전할 수 없습니다. 메서드의 복사 단계는 스레드에 안전하지 않습니다.
    스레드로부터 안전하려면 잠금을 공유하거나 사용하지 마세요

    회신하다
    0
  • 迷茫

    迷茫2017-04-18 09:50:14

    복사본을 실행할 때마다 각 처리 후에 모든 스레드가 표시되도록 어떻게 보장할 수 있나요? 그리고 '맵'을 기반으로 추가하면 다시 읽지 않거나 이후에 스레드를 추가하는 등의 데이터베이스 트랜잭션 문제가 발생할 수 있습니다. 맵을 업데이트하면 스레드 B가 새 맵으로 덮어쓰여집니다.'; 스레드 가시성을 보장할 필요가 없으면 변수 지역화를 위해 ThreadLocal을 사용하세요.

    회신하다
    0
  • 黄舟

    黄舟2017-04-18 09:50:14

    Collections.synchronizedMap(Map)
    은 스레드로부터 안전하게 캡슐화할 수 있습니다

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:50:14

    잠금 장치를 사용하지 않으면 스레드 안전성을 얻을 수 없습니다. 그것은 단지 잠금 장치가 얼마나 발전했는지에 달려 있습니다.
    HashTable 객체 잠금의 모든 작업은 동기화되므로 가장 기본적인 애플리케이션입니다.
    ConcurrentHashMap의 잠금은 내부적으로 파티션과 같은 기능을 구현하고 서로 다른 영역에 서로 다른 키를 저장하기 때문에 비교적 고급입니다. 이 구현을 통해 여러 스레드가 동시에 ConcurrentHashMap을 작동할 수 있지만 동일한 영역에 대한 작업은 여전히 단일 스레드 작업(잠금).

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:50:14

    Collections.synchronizedMap......?

    회신하다
    0
  • 취소회신하다