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