java并发分段锁实践代码

 更新时间:2019年07月04日 14:39:47   作者:cutter_point  
这篇文章主要介绍了java并发分段锁实践代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

以下是代码:

package cn.study.concurrency.ch11;

/**
 * 锁分段
 * @author xiaof
 *
 */
public class StripedMap {
  //同步策略:就是对数组进行分段上锁,n个节点用n%LOCKS锁保护
  private static final int N_LOCKS = 16;
  private final Node[] buckets;
  private final Object[] locks;
  
  private static class Node
  {
    private String name;
    private Node next;
    private String key;
    private String value;
    public String getValue() {
      return value;
    }
    public void setValue(String value) {
      this.value = value;
    }
    public String getName() {
      return name;
    }
    public void setName(String name) {
      this.name = name;
    }
    public Node getNext() {
      return next;
    }
    public void setNext(Node next) {
      this.next = next;
    }
    public String getKey() {
      return key;
    }
    public void setKey(String key) {
      this.key = key;
    }
    
  }
  
  public StripedMap(int numBuckets)
  {
    buckets = new Node[numBuckets];
    //创建对应hash的锁
    locks = new Object[N_LOCKS];
    for(int i = 0; i < N_LOCKS; ++ i)
    {
      locks[i] = new Object();
    }
  }
  
  private final int hash(Object key)
  {
    //取绝对值
    return Math.abs(key.hashCode() % buckets.length);
  }
  
  //get和clear
  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;
      }
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java Lombok简介、使用、工作原理、优缺点

    Java Lombok简介、使用、工作原理、优缺点

    这篇文章主要介绍了Java Lombok简介、使用、工作原理、优缺点的相关资料,帮助大家更好的理解和学习使用Java Lombok,感兴趣的朋友可以了解下
    2021-03-03
  • java线程之使用Runnable接口创建线程的方法

    java线程之使用Runnable接口创建线程的方法

    本篇文章介绍了,java中使用Runnable接口创建线程的方法。需要的朋友参考下
    2013-05-05
  • Java中String类的常用方法总结

    Java中String类的常用方法总结

    java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如"abc" )都可以被看作是实现此类的实例。本文主要为大家介绍了String类的常用方法,需要的可以参考一下
    2022-11-11
  • Java实现短信验证码的示例代码

    Java实现短信验证码的示例代码

    Java是一种流行的编程语言,验证码是一种常用的网络安全技术。Java发展至今,网上也出现了各种各样的验证码,下面是用Java实现短信验证码的总结,感兴趣的可以了解一下
    2023-03-03
  • JAVA中通过Hibernate-Validation进行参数验证

    JAVA中通过Hibernate-Validation进行参数验证

    这篇文章主要介绍了JAVA中通过Hibernate-Validation进行参数验证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 基于Java堆内存的10个要点的总结分析

    基于Java堆内存的10个要点的总结分析

    本篇文章是对Java堆内存的10个要点进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • java实体对象与Map之间的转换工具类代码实例

    java实体对象与Map之间的转换工具类代码实例

    这篇文章主要介绍了java实体对象与Map之间的转换工具类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • java学习之一维数组中重复元素的去除

    java学习之一维数组中重复元素的去除

    关于一维数组中有重复的元素该怎么剔除,作为java初学者的我整理出不调用任何特殊库的基础方法,这种思想在其他语言也适用,有需要的朋友可以借鉴参考下
    2021-09-09
  • 学好Java MyBatis拦截器,提高工作效率

    学好Java MyBatis拦截器,提高工作效率

    这篇文章主要介绍了Java中的 MyBatis拦截器,  Mybatis拦截器设计的初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑。详细内容需要的小伙伴可以参考下面文章内容,希望对你有所帮助
    2022-02-02
  • Idea如何去除Mapper警告方法解析

    Idea如何去除Mapper警告方法解析

    这篇文章主要介绍了Idea如何去除Mapper 警告的方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论