java并发分段锁实践代码

作者:cutter_point 时间:2021-10-08 04:55:45 

以下是代码:


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;
     }
   }
 }
}

来源:https://www.cnblogs.com/cutter-point/p/6077199.html

标签:java,并发,分段锁,实践,代码
0
投稿

猜你喜欢

  • Java中Map集合的常用方法详解

    2021-12-31 16:05:54
  • C# Socket通信的实现(同时监听多客户端)

    2023-07-11 09:25:10
  • C语言指针的图文详解

    2021-07-26 11:26:25
  • Android sharedPreferences实现记住密码功能

    2022-09-11 13:58:37
  • C#后台创建控件并获取值的方法

    2022-10-20 08:39:46
  • Java 中普通代码块,构造代码块,静态代码块区别及代码示例

    2022-07-03 03:54:21
  • Android仿新浪微博发送菜单界面的实现

    2022-12-13 10:54:03
  • 详谈Lock与synchronized 的区别

    2023-03-26 18:13:14
  • C#中ref和out的区别浅析

    2021-12-22 23:00:50
  • Log4j.properties配置及其使用

    2023-05-14 21:06:18
  • 使用java获取md5值的两种方法

    2021-06-18 10:30:30
  • mybatis-plus @DS实现动态切换数据源原理

    2023-07-09 21:44:23
  • C#中的HttpWebRequest类用法详解

    2022-11-07 11:41:17
  • Java Web实现添加定时任务的方法示例

    2023-11-25 02:12:15
  • Java多线程实现Runnable方式

    2022-06-29 17:09:46
  • Spring实战之清除缓存操作示例

    2023-05-31 07:46:26
  • Android Intent调用 Uri的方法总结

    2021-11-13 22:46:53
  • C# 基于TCP 实现扫描指定ip端口的方式示例

    2021-11-28 07:55:24
  • 利用C#实现SSLSocket加密通讯的方法详解

    2023-03-01 02:23:05
  • JAVA多线程之实现用户任务排队并预估排队时长

    2022-03-26 03:06:20
  • asp之家 软件编程 m.aspxhome.com