一、导火索
在看Zookeeper sourcecode的时候,发现server端的NIO*Factory 在channel上获取完SelectionKey列表后,进行了一个shuffle的操作保证公平性,code as followed:
ArrayList<SelectionKey> selectedList = new ArrayList<SelectionKey>(selected); Collections.shuffle(selectedList); for (SelectionKey k : selectedList) { .... }
说实话,对于我这样的资深工程师来说以前从没用过这个方法,来看看它是干什么的
/** * Randomly permutes the specified list using a default source of * randomness. All permutations occur with approximately equal * likelihood. (大致就是说它可以随机的交换list的元素,所有交换的可能性大致是相等的) * If the specified list does not * implement the {@link RandomAccess} interface and is large, this * implementation dumps the specified list into an array before shuffling * it, and dumps the shuffled array back into the list. This avoids the * quadratic behavior that would result from shuffling a "sequential * access" list in place. */
Note that,如果list没有实现RandomAccess interface 或者list比较大,那么它会将list convert to 一个array然后进行shuffle,最后在dump回list里,为什么要这么搞呢,因为这样可以避免二次行为 (相信很多人实际操作中第一想法会直接loop list元素,然后随机交换元素,这就是base knowledge不足啊)
int size = list.size(); if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {//list比较小或者实现了RandomAccess接口,则直接搞就行了. for (int i=size; i>1; i--) swap(list, i-1, rnd.nextInt(i)); } else { Object arr[] = list.toArray(); // Shuffle array for (int i=size; i>1; i--) swap(arr, i-1, rnd.nextInt(i)); // Dump array back into list ListIterator it = list.listIterator(); for (int i=0; i<arr.length; i++) { it.next(); it.set(arr[i]); } }
why?
看看RandomAccess,我挑几句注释来说明
/** * Generic list algorithms are encouraged to check whether the given list is an <tt>instanceof</tt> this interface before applying an algorithm that would provide poor performance if it were applied to a sequential access list, * and to alter their behavior if necessary to guarantee acceptable * performance. * * <p>It is recognized that the distinction between random and sequential * access is often fuzzy. For example, some <tt>List</tt> implementations * provide asymptotically linear access times if they get huge, but constant * access times in practice. Such a <tt>List</tt> implementation * should generally implement this interface. As a rule of thumb, a * <tt>List</tt> implementation should implement this interface if, * for typical instances of the class, this loop: * <pre> * for (int i=0, n=list.size(); i < n; i++) * list.get(i); * </pre> * runs faster than this loop: * <pre> * for (Iterator i=list.iterator(); i.hasNext(); ) * i.next(); * </pre> */
JDK建议我们如果是random access list,则用for(int i=0;i<list.size();i++){} 如果是sequence access list则用Iterator。因为最佳的方式就是用list instanceof RandomAccess来决定具体的算法.
其实数据比较大的时候,二者的效率还是有一定差距的.
JDK的source code还是值得去细细品味的
相关推荐
在实际开发中,将这些jar包添加到项目的类路径(classpath)中,就可以通过Java代码创建Zookeeper客户端,执行诸如创建节点、读取数据、设置监视点等操作。例如: ```java ZooKeeper zookeeper = new ZooKeeper(...
ZooKeeper 是一个开源的分布式应用程序协调服务,由 Apache 软件基金会提供。它提供了许多功能,如配置管理、名字服务、分布式同步、组服务等。 Java 是一种广泛使用的编程语言,连接 ZooKeeper 可以让 Java 应用...
Java中的ZooKeeper是一个分布式协调服务,由Apache Hadoop项目开发,主要用于解决大规模分布式系统中的命名服务、配置管理、集群同步等问题。它提供了一种基于分布式数据一致性模型的树状数据结构,使得多个应用程序...
在压缩包`zookeeperCase`中,可能包含了实现这些功能的Java代码示例,包括创建Zookeeper客户端连接、创建和删除ZNode、监听节点变化、实现分布式锁逻辑以及服务注册和发现的相关类。通过学习和分析这些代码,可以...
主要是java操作zookeeper的client包,在源生api基础上进行扩展的开源JAVA客户端
在Java编程环境中,ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。本资源提供了一个JAVA实现的Zookeeper节点...
这个是利用Java开发,借助于zookeeper来进行节点数据存储的服务器动态上下限感知系统(原先我们有三台服务器进行不停的接受FTP数据,但是这三台服务器在运行的过程中随时都有可能掉线或者断电,这样FTP中的数据就不能...
该项目是一款基于Java和Zookeeper实现的dubbo双端分布式服务设计源码,共包含30个文件,其中包括11个XML配置文件、10个Java源文件、3个YAML配置文件、3个Idea项目配置文件、2个编译生成的class文件、1个Git忽略文件...
Dubbo,由阿里巴巴开源,是一个高性能、轻量级的Java远程服务框架,它提供了服务注册、服务发现、负载均衡、容错处理等核心功能。Dubbo的目标是使服务消费就像调用本地方法一样简单,极大地简化了分布式服务的开发和...
# 基于Java和ZooKeeper的分布式键值存储系统 ## 项目简介 本项目是一个基于Java和ZooKeeper的分布式键值存储系统。系统由客户端(Client)、主节点(Master)、数据节点(Node)和备份节点(Backup)组成。客户端...
# 基于Java和ZooKeeper的分布式数据库管理系统 ## 项目简介 本项目是一个基于Java和ZooKeeper的分布式数据库管理系统,旨在通过分布式架构实现高可用性和负载均衡。项目涵盖了客户端与服务器的通信、数据库操作、...
标题中的“java handler zookeeper for zk's api”指的是在Java中使用Zookeeper的API来处理相关的操作。Zookeeper是一个分布式协调服务,常用于管理分布式应用的配置信息、命名服务、集群状态、选举等功能。在Java中...
ZooKeeper是由Apache软件基金会开发的一个开源项目,主要用于分布式协调服务,而RMI是Java平台上的一个特性,用于实现远程对象调用。 ZooKeeper是一个高可用、高性能的分布式协调服务,它提供了一种简单的方式来...
Java、Zookeeper和Kafka是大数据处理领域中的关键组件,它们在日志处理和存储方面发挥着重要作用。这里我们将深入探讨这些技术如何协同工作,以及如何将日志数据存储到MySQL数据库。 首先,Java作为广泛使用的编程...
【Java大数据作业_4Zookeeper】的课后问题主要涵盖了Zookeeper在HBase中的作用、Zookeeper客户端连接信息获取、Zookeeper实现FIFO队列、MapReduce流程与中间结果的伪代码描述,以及倒排索引的编程实现。以下是详细...
本文将详细讲解如何使用Java与Apache ZooKeeper实现一个分布式锁的示例。 ZooKeeper是一个分布式协调服务,它提供了一种可靠的方式来管理和同步分布式系统的数据。在分布式锁的场景中,ZooKeeper可以作为一个中心化...
Java实现ZooKeeper的zNode监控 本文主要介绍了Java实现ZooKeeper的zNode监控问题,并提供了详细的实现步骤和代码示例。 ZooKeeper是一个分布式应用程序协调服务,可以提供统一的配置管理、统一命名、提供分布式同步...
3. **建立连接**:Java客户端通过`ZooKeeper`类的构造函数建立到Zookeeper服务器的连接。参数包括服务器地址(多个地址之间用逗号分隔,表示集群)和会话超时时间。例如: ```java zk = new ZooKeeper(address, ...
本源码为基于Java的ZooKeeper分布式协调系统设计,包含934个Java文件、66个PNG文件等,共1500个文件。该项目旨在为用户提供一个全面、便捷的分布式协调解决方案,通过Java、C、Python、Shell、JavaScript、HTML和CSS...
Java是世界上最流行的编程语言之一,尤其在企业...以上就是Java面试中可能涉及到的一些核心知识点,涵盖了从基础到高级的多个层面。在准备面试时,全面理解和熟练运用这些概念和技术,将有助于提升你在面试中的竞争力。