eslint+husky+prettier+lint-staged提升前端应用质量 1. 引入扫描工具的初衷1.1 针对痛点目前在梳理前端应用时发现很多代码不规范的地方,包括简单的js问题以及代码格式化的问题,造成了代码可读性下降,另外各种历史代码也是“风格迥异”,甚至影响了应用质量。应用开发成员大部分由于之前是开发后端,对前端开发经验不足以及许多前端知识体系都是在开发过程中现学现用慢慢积累的,另外,痛定思痛总在想对于前端应用代码质量是否也存在诸如Java开发规约扫描插件,类...
入Ali的过去一年,谈谈我对code-review的理解 1. what—什么是CRcodereview(CR)一直以来在软件行业被视为提升代码质量的一种有效的方式,也被视为一种工程师文化的代表。关于什么是CR,在goole出具体的定义如下:代码评审是指在软件开发过程中,对源代码的系统性。通常的目的是查找系统缺陷,保证软件总体质量和提高开发者自身水平。 Code Review是轻量级代码评审,相对于正式代码评审,轻量级代码评审所需要的各种成本要明显...
13篇文章,教你学会ES6知识点 ES6深入理解ES6》学习笔记本文用于汇总链接到各个子章节的内容,github 欢迎大家题issues和PR,如果对你有帮助,也可以给 star 支持 :)目录第一章 块级绑定第二章 字符串和正则表达式第三章 函数第四章 扩展的对象功能第五章 解构:更方便的数据访问第六章 Symbol和Symbol属性第七章 Set与Map第八章 迭代器(Iterator)...
深入理解ES6--13.用模块封装代码 主要知识点:什么是模块、模块中的导出、模块中的导入1. 什么是模块?模块(Modules ) 是使用不同方式加载的 JS 文件(与 JS 原先的脚本加载方式相对) 。这种不同模式很有必要,因为它与脚本(script ) 有大大不同的语义:模块代码自动运行在严格模式下,并且没有任何办法跳出严格模式;在模块的顶级作用域创建的变量,不会被自动添加到共享的全局作用域,它们只...
【Java并发专题】27篇文章详细总结Java并发基础知识 努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事!github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉得不错,欢迎给star鼓励支持 :)整个系列文章为Java并发专题,一是自己的兴趣,二是,这部分在实际理解上很有难度,另外在面试过程中也是经常...
深入理解ES6--6.符号与符号属性 主要知识点:创建符号值、使用符号值、共享符号值、符号值转换。检索符号值属性以及知名符号1. Symbol基础1.1 创建符号值在 JS 已有的基本类型(字符串、数值、布尔类型、 null 与 undefined ) 之外, ES6 引入了一种新的基本类型:符号(Symbol ) 。 符号起初被设计用于创建对象私有成员,而这也是 JS 开发者期待已久的特性。在符号诞生...
并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解 1. ArrayBlockingQueue简介在多线程编程过程中,为了业务解耦和架构设计,经常会使用并发容器用于存储多线程间的共享数据,这样不仅可以保证线程安全,还可以简化各个线程操作。例如在“生产者-消费者”问题中,会使用阻塞队列(BlockingQueue)作为数据容器,关于BlockingQueue可以看这篇文章。为了加深对阻塞队列的理解,唯一的方式是对其实验原理进行理解,这篇文章就主要...
并发容器之BlockingQueue 1. BlockingQueue简介2. 基本操作3. 常用的BlockingQueue1. BlockingQueue简介在实际编程中,会经常使用到JDK中Collection集合框架中的各种容器类如实现List,Map,Queue接口的容器类,但是这些容器类基本上不是线程安全的,除了使用Collections可以将其转换为线程安全的容器,Doug Lea大师为我们都准备了...
并发容器之CopyOnWriteArrayList 1. CopyOnWriteArrayList的简介java学习者都清楚ArrayList并不是线程安全的,在读线程在读取ArrayList的时候如果有写线程在写数据的时候,基于fast-fail机制,会抛出ConcurrentModificationException异常,也就是说ArrayList并不是一个线程安全的容器,当然您可以用Vector,或者使用Collections的静态方法将...
一篇文章,从源码深入详解ThreadLocal内存泄漏问题 1. 造成内存泄漏的原因?threadLocal是为了解决对象不能被多线程共享访问的问题,通过threadLocal.set方法将对象实例保存在每个线程自己所拥有的threadLocalMap中,这样每个线程使用自己的对象实例,彼此不会影响达到隔离的作用,从而就解决了对象在被共享访问带来线程安全问题。如果将同步机制和threadLocal做一个横向比较的话,同步机制就是通过控制线程访问共享对象...
并发容器之ThreadLocal 1. ThreadLocal的简介2. ThreadLocal的实现原理3. ThreadLocalMap详解3.1 Entry数据结构3.2 set方法3.3 getEntry方法3.4 remove4. ThreadLocal的使用场景1. ThreadLocal的简介在多线程编程中通常解决线程安全的问题我们会利用synchronzed或者lock控制线程对...
并发容器之ConcurrentLinkedQueue 1.ConcurrentLinkedQueue简介在单线程编程中我们会经常用到一些集合类,比如ArrayList,HashMap等,但是这些类都不是线程安全的类。在面试中也经常会有一些考点,比如ArrayList不是线程安全的,Vector是线程安全。而保障Vector线程安全的方式,是非常粗暴的在方法上用synchronized独占锁,将多线程执行变成串行化。要想将ArrayList变成线程...
并发容器之ConcurrentHashMap(JDK 1.8版本) 1.ConcurrentHashmap简介在使用HashMap时在多线程情况下扩容会出现CPU接近100%的情况,因为hashmap并不是线程安全的,通常我们可以使用在java体系中古老的hashtable类,该类基本上所有的方法都采用synchronized进行线程安全的控制,可想而知,在高并发的情况下,每次只有一个线程能够获取对象监视器锁,这样的并发性能的确不令人满意。另外一种方式通过Co...
LockSupport工具 1. LockSupport简介在之前介绍AQS的底层实现,已经在介绍java中的Lock时,比如ReentrantLock,ReentReadWriteLocks,已经在介绍线程间等待/通知机制使用的Condition时都会调用LockSupport.park()方法和LockSupport.unpark()方法。而这个在同步组件的实现中被频繁使用的LockSupport到底是何方神圣,现在...
详解Condition的await和signal等待/通知机制 1.Condition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来...
深入理解ES6--2.字符串与正则表达式 主要知识点:新增的字符串处理方法、模板字面量以及正则表达式上的改动1. 字符串处理方法 codePointAt()方法ES6 为全面支持 UTF-16 而新增的方法之一是 codePointAt() ,它可以在给定字符串中按位 置提取 Unicode 代码点。该方法接受的是码元位置而非字符位置,并返回一个整数值。 String.fromCodePoint()...
深入理解ES6--12.代理与反射接口 主要知识点:代理和反射的定义、常用的陷阱函数、可被撤销的代理、将代理对象作为原型使用、将代理作为类的原型1. 代理和反射 代理是什么?通过调用 new Proxy() ,你可以创建一个代理用来替代另一个对象(被称之为目目标对象) ,这个代理对目标对象进行了虚拟,因此该代理与该目标对象表面上可以被当作同一个对象来对待。代理允许你拦截目标对象上的底层操作,而这本来...
深入理解读写锁ReentrantReadWriteLock 1.读写锁的介绍在并发场景中用于解决线程安全的问题,我们几乎会高频率的使用到独占式锁,通常使用java提供的关键字synchronized(关于synchronized可以看这篇文章)或者concurrents包中实现了Lock接口的ReentrantLock。它们都是独占式获取锁,也就是在同一时刻只有一个线程能够获取锁。而在一些业务场景中,大部分只是读数据,写数据很少,如果仅仅是读数据的话并...
彻底理解ReentrantLock 1. ReentrantLock的介绍ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性(关于synchronized可以看这篇文章),synchronized通过获取自增,释放自减的方式实现重入。与此同时,R...
深入理解AbstractQueuedSynchronizer(AQS) 1. AQS简介在上一篇文章中我们对lock和AbstractQueuedSynchronizer(AQS)有了初步的认识。在同步组件的实现中,AQS是核心部分,同步组件的实现者通过使用AQS提供的模板方法实现同步组件语义,AQS则实现了对同步状态的管理,以及对阻塞线程进行排队,等待通知等等一些底层的实现处理。AQS的核心也包括了这些方面:同步队列,独占式锁的获取和释放,共享锁的获取和释放以及...