java并发分段锁实践代码
作者:cutter_point 发布时间:2021-10-08 04:55:45
标签: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;
}
}
}
}
来源:https://www.cnblogs.com/cutter-point/p/6077199.html
0
投稿
猜你喜欢
- Mybatis-plus全局id生成策略在配置文件中加入以下代码后就不需要在实体类种的id上添加@TableId(value = “id”,
- 本文实例为大家分享了Android App获取屏幕旋转角度的具体代码,供大家参考,具体内容如下一、获取屏幕旋转角度的方法是:int rota
- 本文实例讲述了C#定时关闭窗体的方法,分享给大家供大家参考。具体方法如下:public partial class Form2 : Form
- 我们讲一下Criteria查询,这个对于不是太熟悉SQL语句的我们这些程序员来说是很容易上手的。 废话不多说,看一下例子:&nbs
- 网上搜集了java的学习思维导图,分享给大家。01.Java程序设计(基础)02.Java程序设计(专题)03.客户端网页编程04.Java
- 一、材料准备1、jdk1.8的安装包2、maven安装包3、idea工具二、配置jdk1.8环境变量1.jdk下载jdk下载网址(点击此链接
- 前言JDK 1.5 之前 synchronized 的性能是比较低的,但在 JDK 1.5 中,官方推出一个重量级功能 Lock,一举改变了
- https://www.jb51.net/article/114838.htm这篇文章很详细的介绍了JS的跨域,给出的解决方案是spring
- 本文实例讲述了C#实现的二维数组排序算法。分享给大家供大家参考,具体如下:class Order{ /// <summar
- 今天给大家介绍一下Java实现钢琴的小程序,程序虽小,功能挺多,支持循环播放,录音等功能,首先简单介绍下源码结构:先看看钢琴界面实现,添加相
- Spring Framework 提供了一套可以方便地对 Controller 层中接收的参数进行校验的框架,其中就包括了 @Validat
- 本文实例为大家分享了java实现2048小游戏的具体代码,供大家参考,具体内容如下效果图:游戏介绍:1.2048是一款益智类小游戏,刚开始随
- 前言:CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。例如,应用程序的主线程希望在负
- Java 最初版本只为常用的数据结构提供了很少的一组类:Vector、Stack、Hashtable、BitSet 与 Enumeratio
- 前言Spring官方最近宣布,将在Spring Framework 5.0版本中正式支持Kotlin语言。这意味着Spring Boot 2
- 前提:当我们使用Winform开发的时候,经常会遇到:System.InvalidOperationException:&ldquo
- 在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果。但在多线程的异步开发
- Android Spinner 组件Spinner: 下拉组件使用事项:布局在XML 中实现,具体的数据在JAVA 代码中实现;所用知识点:
- 直接调用HashKit.sha1(String str)方法就可以了,,返回的是16进制的字符串长度是40,也就是用md.digest()方
- 1、for循环虽然所有循环结构都可以用 while 或者 do…while来表示,但 for 循环的出现,可使一些循环