【Java并发】JAVA并发编程实战-读书笔记17

本文是关于Java并发编程的读书笔记,重点讨论了ConcurrentHashMap的实现原理,包括其锁分段策略以提高并发性能。同时,文章列举并分析了多个并发编程中常见的问题和误区,如不适当的同步性、线程池的使用、锁的释放和等待通知的正确做法等,旨在帮助开发者提高并发应用的性能和可伸缩性。
摘要由CSDN通过智能技术生成

ConcurrentHashMap的实现使用了一个包含16个锁的Array,每一个锁都守护Hash Bucket1/16Bucket N由第N mod 16个锁来守护。

public class StripedMap{

  //同步策略:buckets[n]由lock[n%N_LOCKS]保护

  private static final int N_LOCKS=16;

  private final Node[] buckets;

  private final Object[] locks;

  private static class Node{...}

  public StripedMap(int numBuckets){

    buckets=new Node[numBuckets];

    locks=new Object[N_LOCKS];

    for(int i=0;i<N_LOCKS;i++){

      locks[i]=new Object();

    }

  }

  public final int hash(Object key){

    return Math.abs(key.hashCode()%buckets.length);

  }

  public Object get(Object key){

    int hash=hash(key);

    synchronized(locks[hash%N_LOCKS]){

      for(Node m=buckets[hash];m!=null;m=m.next){

        if(m.key.equals(key)){

          return m.value;

        }

      }

    }

    return null;

  }

  public void clear(){

    for(int i=0;i<buckets.length;i++){

      synchronized(locks[i%N_LOCKS]){

        buckets[i]=null;

      }

    }

  }

}

上面的例子是基于哈希的 map 中使用分离锁。

如果由你来实现HashMap,你会遇到一个问题,size方法如何计算Map条目的大小?最简单的方法是每次调用的时候数一遍。或者在putremove时加入一个计数器。在单线程或完全同步的实现中,一个独立的计数器能够提高sizesiEmpty的速度,但是会影响到可伸缩性,因为每一个修改map

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值