阅读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;
}
}
}
分享到:
相关推荐
基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 RabbitMQ消息路由机制分析 RabbitMQ消息确认机制 Redis redis数据结构分析 ...
原生的 Map 实现通常基于这种思想,但在某些特定场景下,可能无法达到最佳性能。 superhawk610-dumbhashmap 的设计目标就是针对这些性能瓶颈,提供更优的解决方案。该项目的名称“DumbHashMap”或许会让人误解,但...
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...
框架实现 log4j logback commong logging jdk logger 测试框架 测试框架 junit easymock testng mockito bug管理 禅道 jira 开发工具 编程工具 eclipse myeclipse idea vi VS webstorm ...
- 通过临时节点实现锁。 - 性能方面,Redis实现的分布式锁通常优于Zookeeper。 #### 3. 分布式消息队列 - **Kafka**: - 高吞吐量、低延迟。 - 支持消息持久化。 - **ActiveMQ**: - 功能强大,但性能较低。 - *...
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...
5. **主从复制**: 支持自动将数据从主机同步到从机,实现读写分离。 #### 二、Redis的应用场景 **1. 高性能读写**: - **应用场景**: 当用户首次访问数据库中的某些数据时,由于是从硬盘读取,速度较慢。将这些数据...
以Java为例,使用自带的map 或者guava实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着jvm的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。使用Redis 或...
12. **Struts**:Struts是一个基于MVC(Model-View-Controller)架构的Web应用框架,用于组织和控制应用程序的业务逻辑。 13. **String、StringBuffer、StringBuilder**:String是不可变对象,而StringBuffer和...
- 容器类:实现了STL风格的容器,如Map、Hash_Map、Set、List等。 - 信号处理:封装了特定OS的信号接口,便于安装、移除信号处理器。 - 文件系统组件:包含文件I/O、异步I/O、文件加锁等功能的包装类。 - 线程...
每种类型都有其独特的应用场景,如String用于存储简单键值对,Hash适合存储对象,List可以实现消息队列功能,Set支持不重复成员,而Sorted Set则能按值进行排序。 3. Redis命令:Redis提供了丰富的命令来操作这些...
- **Set/Map**:基于红黑树实现的关联容器,提供键值对的快速查找。 - **Heap**:堆结构,主要用于优先队列。 - **Hash Table**:哈希表,用于快速查找。 2. **迭代器(Iterator)**:提供了一种通用的方式来访问...
- `Hashtable`继承自`Dictionary`类,而`HashMap`是基于哈希表的`Map`接口的实现。 - **抽象类与接口的区别**: - 抽象类可以包含构造器、抽象方法、具体方法、静态方法和非静态方法;而接口只能包含默认方法、...
`HashMap`作为`Map`接口的一个实现,它提供了基于哈希表的数据结构,能够快速地进行插入、删除和查找操作。 **详细解释:** 1. **Set:** `Set`是一个不包含重复元素的集合。它没有明确的顺序,并且不能包含`null`...
以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。使用 redis ...
5. **Hash**:类似Map的结构,可以将多个字段存储在一个键下。 #### 四、Redis资源消耗分析 Redis主要消耗的是内存资源。由于所有的数据都在内存中处理,因此内存大小直接影响Redis的性能和数据量大小。为了最大化...
2. 数据分布存储:TBase的数据分布策略是基于Hash[key]%shard map,保证数据在节点间的均匀分布。 3. 部署需求:TBase体验版最小化部署至少需要两台机器。 4. 组件功能:OSS(对象存储服务)用于存储数据,CN...
- **倒排索引逻辑结构**:基于Keyhash和docidarray构建,其中Keyhash由字段名和词条组成。 #### 实时更新 58同城的搜索系统支持实时更新功能,能够在不中断服务的情况下处理数据的新增、修改或删除操作。这种机制...
- **面向切面编程(AOP)**:将横切关注点(如日志记录、事务管理)从业务逻辑中分离出来。 #### 15. AJAX技术 - **异步JavaScript与XML**:一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 - **...