`
frenchmay
  • 浏览: 231350 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

应用分离锁的基于hash的map实现

阅读更多

    阅读java并发编程实践第11章,11.4减少锁的竞争.

    ConcurrentHashMap的实现使用了一个包含16个对象锁的数组,每个锁都负责同步hash buckets数组中的  1/16的元素;buckets中的第n个元素由locks中第 n除以16 个锁来守护.假设hash算法的实现能够提供合理的扩展性,并且关键字能够以统一的方式访问,这会将对于锁的请求减少到原来的1/16.这种基于分离锁设计的技术实现能够使得ConcurrentHashMap支持16个并发的请求.

  但是分离锁的负面作用是:对容器加锁,进行独占访问变得更加困难,并且更加昂贵.

例如当buckets的负载度超过了阀值,容量需要被扩展,元素需要重新排序.然后放入一个更大的buckets的时候,我们必须获得所有的分离锁.

  分离锁能够改进伸缩性能,因为它们支持不同的线程操作不同的数据(或者同一个数据结构的不同部分),而不会产生相互间的干扰.这一点对于那些对锁的竞争普遍大于锁守护数据的竞争的程序十分有益.

 

public class StropedMap

{

	private static final int N_LOCKS = 16;

	private final Node[] buckets;

	private final Object[] locks;

	

	public StropedMap(int numBuckets)

	{

		super();

		buckets = new Node[numBuckets];

		locks = new Object[N_LOCKS];

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

			synchronized(locks[i%N_LOCKS]){

				buckets[i] = null;

			}

		}

	}

	

	class Node {

		Object key;

		Object value;

		Node next;



		public Node(Object key, Object value) {

			super();

			this.key = key;

			this.value = value;

			this.next = null;

		}

	}

}

 

 

分享到:
评论

相关推荐

    Java思维导图xmind文件+导出图片

    基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 RabbitMQ消息路由机制分析 RabbitMQ消息确认机制 Redis redis数据结构分析 ...

    开源项目-superhawk610-dumbhashmap.zip

    原生的 Map 实现通常基于这种思想,但在某些特定场景下,可能无法达到最佳性能。 superhawk610-dumbhashmap 的设计目标就是针对这些性能瓶颈,提供更优的解决方案。该项目的名称“DumbHashMap”或许会让人误解,但...

    超级有影响力霸气的Java面试题大全文档

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    框架实现 log4j logback commong logging jdk logger 测试框架 测试框架 junit easymock testng mockito bug管理 禅道 jira 开发工具 编程工具 eclipse myeclipse idea vi VS webstorm ...

    2019年一线互联网公司Java高级面试题总结

    - 通过临时节点实现锁。 - 性能方面,Redis实现的分布式锁通常优于Zookeeper。 #### 3. 分布式消息队列 - **Kafka**: - 高吞吐量、低延迟。 - 支持消息持久化。 - **ActiveMQ**: - 功能强大,但性能较低。 - *...

    net学习笔记及其他代码应用

    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...

    Redis常见面试题和答案(最新版).pdf

    5. **主从复制**: 支持自动将数据从主机同步到从机,实现读写分离。 #### 二、Redis的应用场景 **1. 高性能读写**: - **应用场景**: 当用户首次访问数据库中的某些数据时,由于是从硬盘读取,速度较慢。将这些数据...

    Redis面试题 70道.pdf

    以Java为例,使用自带的map 或者guava实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着jvm的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。使用Redis 或...

    京东校园招聘历年经典面试题汇总:Java开发1

    12. **Struts**:Struts是一个基于MVC(Model-View-Controller)架构的Web应用框架,用于组织和控制应用程序的业务逻辑。 13. **String、StringBuffer、StringBuilder**:String是不可变对象,而StringBuffer和...

    ACE 基础培训教程

    - 容器类:实现了STL风格的容器,如Map、Hash_Map、Set、List等。 - 信号处理:封装了特定OS的信号接口,便于安装、移除信号处理器。 - 文件系统组件:包含文件I/O、异步I/O、文件加锁等功能的包装类。 - 线程...

    redis学习脑图mmap.zip

    每种类型都有其独特的应用场景,如String用于存储简单键值对,Hash适合存储对象,List可以实现消息队列功能,Set支持不重复成员,而Sorted Set则能按值进行排序。 3. Redis命令:Redis提供了丰富的命令来操作这些...

    STL源码剖析STL源码剖析STL源码剖析

    - **Set/Map**:基于红黑树实现的关联容器,提供键值对的快速查找。 - **Heap**:堆结构,主要用于优先队列。 - **Hash Table**:哈希表,用于快速查找。 2. **迭代器(Iterator)**:提供了一种通用的方式来访问...

    java高级工程师面试总结

    - `Hashtable`继承自`Dictionary`类,而`HashMap`是基于哈希表的`Map`接口的实现。 - **抽象类与接口的区别**: - 抽象类可以包含构造器、抽象方法、具体方法、静态方法和非静态方法;而接口只能包含默认方法、...

    java面试200题

    `HashMap`作为`Map`接口的一个实现,它提供了基于哈希表的数据结构,能够快速地进行插入、删除和查找操作。 **详细解释:** 1. **Set:** `Set`是一个不包含重复元素的集合。它没有明确的顺序,并且不能包含`null`...

    redis面试相关问题整理(含答案)

    以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。使用 redis ...

    Redis面试专题(二).pdf

    5. **Hash**:类似Map的结构,可以将多个字段存储在一个键下。 #### 四、Redis资源消耗分析 Redis主要消耗的是内存资源。由于所有的数据都在内存中处理,因此内存大小直接影响Redis的性能和数据量大小。为了最大化...

    分布式数据库 TBase考题及答案_85分版 .docx

    2. 数据分布存储:TBase的数据分布策略是基于Hash[key]%shard map,保证数据在节点间的均匀分布。 3. 部署需求:TBase体验版最小化部署至少需要两台机器。 4. 组件功能:OSS(对象存储服务)用于存储数据,CN...

    顶级IT公司面试题

    - **面向切面编程(AOP)**:将横切关注点(如日志记录、事务管理)从业务逻辑中分离出来。 #### 15. AJAX技术 - **异步JavaScript与XML**:一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 - **...

Global site tag (gtag.js) - Google Analytics