node

同步容器与并发容器

戏子无情 提交于 2019-12-17 03:36:32
同步容器 性能差,线程不安全 Vector (线程安全)--> ArrayList(线程不安全) Vector public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true; } 直接在方法上加同步,保证线程安全,不适用并发执行,性能损耗大 arrayList 1 public boolean add(E e) { 2 ensureCapacityInternal(size + 1); // Increments modCount!! 3 elementData[size++] = e; 4 return true; 5 } ArrayList<String> s = new ArrayList<>(); Collections.synchronizedList(s); 保证线程安全 static class SynchronizedList<E> extends SynchronizedCollection<E> implements List<E>add() 1 public void add(int index, E element) { 2 synchronized

node实现即时消息通知

天涯浪子 提交于 2019-12-17 03:27:29
关于这个项目,是关于我们设计模式的案例设计 题目是重构我们教务在线的教师端,实现消息通知 也就是说,当教师的监考发生变动时,就产生即时的消息。 刚刚看的这个题目,我想到的是,利用观察者模式,在JavaScript中,观察者模式又称为发布订阅模式。 对于教师端来说,教师就是订阅者,管理员发布更新监考事宜为发布事件。教师订阅了“更新监考”这个事件,一旦管理员触发事件,则教师会收到消息。 如何实现呢? 1. 发布事件 这件事的过程,实际上是,管理员端向后端提交更新的数据,触发了更新监考事件,服务器端主动向客户端推送其订阅的消息。 首先,管理员向后端提交更新的数据:这件事非常好实现,管理员向后端发起post请求,即可提交更新。 然后,触发更新事件,如何触发事件呢?如何实现服务端向客户端推送消息呢? 2. 推送消息 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。 当你获取

Redis Cluster集群配置与管理

痞子三分冷 提交于 2019-12-17 02:58:52
Redis Cluster介绍 Redis Cluster集群是redis集群的一种方式,由官方提供,由多个节点组成的分布式网络集群,每个节点可以是主,也可以是从,但每个主节点都需要有对应的从节点,保证高可用,主节点提供数据读写,不支持同时处理多个键(如mset/mget命令),因为redis需要把键均匀分布在各个节点上,并发量很高的情况下同时创建键值会降低性能并导致不可预测的行为。支持在线增加、删除节点,客户端可以连任何一个主节点进行读写。 Redis Cluster采用了分布式系统的分片(分区)的思路,每个主节点为一个分片,这样也就意味着 存储的数据是分散在所有分片中的。当增加节点或删除主节点时,原存储在某个主节点中的数据 会自动再次分配到其他主节点。 如图,各节点间是相互通信的,通信端口为各节点Redis服务端口+10000,这个端口是固定的,所以注意防火墙设置, 节点之间通过二进制协议通信,这样的目的是减少带宽消耗。 在Redis Cluster中有一个概念slot,我们翻译为槽。Slot数量是固定的,为16384个。这些slot会均匀地分布到各个节点上,另外Redis的键和值会根据hash算法存储在对应的slot中。简单讲,对于一个键值对,存的时候在哪里是通过 hash算法算出来的,那么取得时候也会算一下,知道值在哪个slot上。根据slot编号再到对应的节点上去取。

Nodejs正则表达式函数之match、test、exec、search、split、replace使用详解

淺唱寂寞╮ 提交于 2019-12-17 02:54:56
Nodejs正则表达式函数之match、test、exec、search、split、replace使用详解 1. Match函数 使用指定的正则表达式函数对字符串惊醒查找,并以数组形式返回符合要求的字符串 原型:stringObj.match(regExp) 参数: stringObj 必选项,需要去进行匹配的字符串 RegExp 必选项,指定的正则表达式 返回值:如果没有使用g(全局匹配)选项,则返回第一个匹配的字符串、该字符串所在位置及原始字符串组成的数组,如果使用g选项,则返回所有匹配的字符串组成的数组 //示例1: var str = “aaabbbcccaaabbbccc”; var res = str.match(/aaa/); //没有使用g选项 console.log(res); //输出[ 'aaa', index: 0, input: 'aaabbbcccaaabbbccc' ] 第一个表示匹配的字符串;第二个表示匹配的字符串坐在的索引位置,从0开始计算;第三个表示原始字符串; //示例2: var str = “aaabbbcccaaabbbccc”; var res = str.match(/aaa/g); //使用g选项,全局匹配 console.log(res); //输出[ 'aaa', 'aaa' ] 所有匹配的字符串组成的数组 //示例3:

Java显式锁学习总结之六:Condition源码分析

放肆的年华 提交于 2019-12-17 02:54:35
概述 先来回顾一下java中的等待/通知机制 我们有时会遇到这样的场景:线程A执行到某个点的时候,因为某个条件condition不满足,需要线程A暂停;等到线程B修改了条件condition,使condition满足了线程A的要求时,A再继续执行。 自旋实现的等待通知 最简单的实现方法就是将condition设为一个volatile的变量,当A线程检测到条件不满足时就自旋,类似下面: public class Test { private static volatile int condition = 0; public static void main(String[] args) throws InterruptedException { Thread A = new Thread(new Runnable() { @Override public void run() { while (!(condition == 1)) { // 条件不满足,自旋 } System.out.println("a executed"); } }); A.start(); Thread.sleep(2000); condition = 1; } } 这种方式的问题在于自旋非常耗费CPU资源,当然如果在自旋的代码块里加入Thread.sleep(time)将会减轻CPU资源的消耗

并发之lock的condition接口

浪尽此生 提交于 2019-12-17 01:35:37
13.死磕Java并发-----J.U.C之Condition 12.Condition使用总结 11.Java并发编程系列之十七:Condition接口 === 13.死磕Java并发-----J.U.C之Condition 此篇博客所有源码均来自JDK 1.8 在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait()、notify()系列方法可以实现等待/通知模式。在Java SE5后,Java提供了Lock接口,相对于Synchronized而言,Lock提供了条件Condition,对线程的等待、唤醒操作更加详细和灵活。下图是Condition与Object的监视器方法的对比(摘自《Java并发编程的艺术》): Condition提供了一系列的方法来对阻塞和唤醒线程: await() :造成当前线程在接到信号或被中断之前一直处于等待状态。 await(long time, TimeUnit unit) :造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。 awaitNanos(long nanosTimeout) :造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。返回值表示剩余时间,如果在nanosTimesout之前唤醒,那么返回值 = nanosTimeout - 消耗时间,如果返回值 <=

C#实现中国行政区划数据下载

戏子无情 提交于 2019-12-17 00:41:29
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> private string BaseURL = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2018/"; public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { // 从网页的Url链接加载 var url = BaseURL + "index.html"; var web = new HtmlWeb(); web.OverrideEncoding = Encoding.GetEncoding("gb2312"); var doc = web.Load(url, "get"); HtmlNodeCollection provinces = doc.DocumentNode.SelectNodes("//tr[@class='provincetr']/td"); foreach (HtmlNode province in provinces) { TreeNode node = new TreeNode(); node.Tag = province.InnerText.Trim(); node.Name =

HashMap 完全解析

回眸只為那壹抹淺笑 提交于 2019-12-16 23:39:08
HashMap 完全解析 1. 基本特点 2. 存储结构 2.1 HashMap 数据底层具体存储的是什么? 2.2 为什么要用单链表的方式? 3. HashMap 的成员变量 4. 确定数组索引位置的 hash 算法 4.1 为什么要采用这种算法呢? 番外: 为什么用 & 操作呢? 为什么可以使用位运算(&)来实现取模运算(%)呢 5. 存储数据的 put 方法 6. HashMap 的扩容机制 7. 为什么HashMap线程不安全? 7.1 多线程 put,导致的数据不一致。 7.2 resize 造成的无限循环 参考 1. 基本特点 HashMap 是 java 中用于映射(键值对)处理的数据类型。基于哈希表的 Map 接口的实现。最多只允许一条记录的键为 null,允许多条记录的值为 null。 HashMap 不保证映射的顺序。特别是, 它不能保证顺序会随着时间的推移保持恒定 。 HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度 O(1)。 2. 存储结构 从结构实现来讲,HashMap 是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的。 [图片上传失败…(image-7d8358-1576498907545)] 2.1 HashMap 数据底层具体存储的是什么? 通过查看 HashMap 的源码

NodeJS学习笔记五

拥有回忆 提交于 2019-12-16 22:57:19
Promise简介 所谓Promise,就是一个对象,用来传递异步操作的消息。 Promise对象有以下两个特点。 (1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称Fulfilled)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。 (2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。 基本用法 ES6规定,Promise对象是一个构造函数,用来生成Promise实例。 下面代码创造了一个Promise实例。 var promise = new Promise ( function ( resolve , reject ) { // ... some code if ( /* 异步操作成功 */ ){

面试3——java集合类总结(Map)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-16 22:30:53
1.概述: Java 中的map集合使用键值对(key-value)来保持数据,其中值(value)可以重复,键(key)必须唯一,但最多只能有一个key为空,它的主要实现类有HashMap、HashTable、TreeMap、LinkedHashMap. Map集合方法摘要 map和collection的区别: map存储的是键值对形式的元素,键唯一,值可以重复 collection存储的是单列元素,子接口set元素唯一,子接口list元素可以重复 map集合的数据结构值针对键有效,跟值无关,collection集合的数据结构针对的是元素有效 map的遍历方式(4种) package Three; import java.util.*; public class Map_sort { public static void main(String[] args) { Map<String,String> map = new HashMap<String, String>(); map.put("a","@"); map.put("f","@"); map.put("n","@"); map.put("e","@"); map.put("q","@"); map.put("d","@"); map.put("l","@"); // 第一种遍历map的方法,通过加强for循环map