Java中的数据结构
Java中的数据结构若不提到Jdk版本,本文中的源码都是基于jdk8版本分析的 注:有关同步集合(如Vector、ConcurrentHashMap、CopyOnWriteArrayList等)请移步博客 数组集合类,是Collection接口的子类,有序的Collection实现,包含ArrayList、LinkedList、Vector,其中Vector是线程安全的ArrayList,LinkedList是底层基于双向链表实现的List ArrayList的默认大小为10,扩容操作: 也就是1.5倍 不重复集合类,不能包含重复的元素,是Collection接口的子类,包含HashSet、LinkedHashSet、TreeSet,其实都是基于Map类的实现,所以详细了解请参阅Map类

2019-07-12鱼鱼
多线程应用提高(III) 并发编程的艺术
多线程应用提高(III) 并发编程的艺术《并发编程的艺术》p36:JMM不保证64位的long型和double型变量的写操作具有原子性 面试中可能经常会被问到HashMap和HashTable的区别,其中最重要的就是前者并不是线程安全的,但其实在高并发的情形下,后者的效率低的不像话甚至不可用,所以在jdk7之后出现了线程高效且安全的ConcurrentHashMap 当并发严重时,某线程若是调用了同步方法,另外的线程将进入阻塞/轮询状态,既不能put也不能get,但ConcurrentHashMap是不同的,它采用了锁的分段技术,将数据分段存储,不同的数据持有不同的锁,这样可用性会大大高于HashTable,所以在实际开发中我们都用ConcurrentHashMap取代HashTable
![多线程应用提高(III) 并发编程的艺术]()
2019-06-18鱼鱼
第一个Vue前端独立项目构建尝试(工程化)
第一个Vue前端独立项目构建尝试(工程化)开始我的第一个前端独立项目的构建 使用webPack、npm进行项目模块化构建 安装相关软件准备构建: VSCode npm(node) 查看版本 npm -v node -v 安装相关依赖(使用淘宝镜像): npm install -g cnpm --registry=http://registry.npm.taobao.org 安装vue-cli脚手架: npm install -g vue-cli 查看版本: vue --version 进入目录后新建vue工程: vue init webpack projectname 配置相关内容:

2019-05-04鱼鱼
多线程应用提高(II) 线程池
多线程应用提高(II) 线程池项目中,当发生并行操作时,一般都会用到线程池处理多线程任务,线程池的规则类似于数据库连接池,在此不予赘述 jdk自带线程池,此处主要讲述Spring框架自带的线程池ThreadPoolTaskExecutor 通过实现Runnable和Callable接口实现一个线程任务,从而能放入Executor进行线程管理 其中,Callable可以理解为带有返回值的Runnable,并且Callable需要实现的方法不是run()而是call(),该方法返回一个泛型对象 当我们把一个需要返回值的线程任务放进线程池后,线程池会返回一个Future对象,借助该对象,我们可以调用get()方法获取线程的状态,调用get()会阻塞当前线程直到返回结果

2020-02-25鱼鱼
tips
tips一些小tip: 向上转型,失去特征 定义相同对象,重写hash和(不是或)equal Vue.nextTick() 回调函数:在Vue(重新)渲染页面之后调用 vue绑定样式,我们会发现background-color 不能直接绑定 需写为backgroundColor 因为js中不允许出现‘-’ 存库之前,mysql会把换行符什么的过滤掉,使得出入不一致(应用场景:textarea存)解决:this.value.replace(/\n|\r\n/g,"
") linux下的mysql的表名是区分大小写的! 实现线程接口 Runnable 注解注入失败 注解注入失败 Linux下缺少部分字体,使用drawString会出问题(二维码模块),解决手段:从windows引入字体,因为不是什么主流问题所以就简单写一下,如果再碰到相关问题在详细的讲述一下
![tips]()
2019-05-08鱼鱼
什么是web服务器?什么是web应用服务器?容器、以及服务器概念的区分(萌新向)
什么是web服务器?什么是web应用服务器?容器、以及服务器概念的区分(萌新向)本文主要是为了帮助萌新理解在web开发时遇到的关于web工作原理的疑问,由于本人水平十分有限,所以本文仅作为一般性参考,如有错误,欢迎批评指正OVO 首先说明的是,我们所谓的web服务器并不是物理上的服务器,而是建立在物理服务器上的一个web应用的运行环境,是一个软件服务器 这就好比前后端分离开发时,后端模块在物理服务器上的JVM,前端也需要一个“运行环境”进行工作,那么web服务器端概念就应运而生了,大概就好比下图 上图中拥有VUE经典的原谅色的web服务器就是我们前端运行的地方,可见web服务器的主要作用是给前端一个合理的运行环境,其实不只是看起来那么简单,web服务器还要处理代理、反向代理、跨域、并支持并发等等

2019-06-16Agostino
阿里巴巴Java开发手册 华山版 v1.5
阿里巴巴Java开发手册 华山版 v1.5《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,公开到业界后,众多社区开发者踊跃参与,共同打磨完善,系统化地整理成册 现代软件行业的高速发展对开发者的综合素质要求越来越高,因为不仅是编程知识点,其它维度的知识点也会影响到软件的最终交付质量 比如:数据库的表结构和索引设计缺陷可能带来软件上的架构缺陷或性能风险;工程结构混乱导致后续维护艰难;没有鉴权的漏洞代码易被黑客攻击等等 所以本手册以 Java 开发者为中心视角,划分为编程规约、异常日志、单元测试、安全规约、MySQL 数据库、工程结构、设计规约七个维度,再根据内容特征,细分成若干二级子目录

2020-02-24鱼鱼
Java的SPI机制
Java的SPI机制SPI(Service Provider Interface) 是JDK内部提供的一种用于服务能力扩展的机制 在服务中通过不同的下沉方法实现能够加载不同的接口实现类,从而实现功能的热插拔 相比一些类似的设计模式(例如策略模式), SPI作为Java自带的实现特性,相对更加灵活和开放 我们常见的JDBC、日志框架slf4j、JavaMail、Spring等组件都基于 SPI实现(例如JDBC针对不同数据源的驱动) 之所以说区别于Java的一些设计模式,因为Java有一些实现能实现 SPI的动态加载 首先让我们定义 SPI对外提供抽象能力的接口类,这里为了便于理解展示包路径:

2024-10-14鱼鱼
IO多路复用模型:select、poll、epoll对比
IO多路复用模型:select、poll、epoll对比我们平时提到的I/O几乎都是同步 阻塞模型,譬如网络请求的socket IO,在数据返回前,相应的线程或是进程将会一直 阻塞直到数据返回,比较直接的处理便是针对IO流一对一的监听,但在IO返回前,相应的系统资源会平白无故的浪费,这种处理方式会大大降低服务器的吞吐 如果我们用很少的线程来监听这些IO,就能实现对系统资源的更好利用,在相应的socket有数据返回时才去读取数据 这种方式被称作IO多路复用,在Linux系统中,实现IO多路复用的方式(从古老到新)有select、poll和epoll 现在很多中间件都使用epoll IO多路复用模型才因此有着很高的性能和吞吐 此处简单描述三种方式的实现和区别

2020-08-11鱼鱼
分布式系统一致性的分类
分布式系统一致性的分类在分布式系统中的CAP理论中有C(一致性),大郅表示分布式系统中节点状态或数据具有一致的特性 但一致性有着不同的分类,例如常见的用于取代CAP理论的BASE中的E,最终一致性,不同于强一致性,他强调着事务最终状态趋于一致,但中间态可能不一致,利用此篇文章总结一下分布式系统的一致性分类 根据实际系统的要求,分布式系统的一致性可以大致分为四类: 严格一致性 强一致性(线性一致/原子一致) 顺序一致性 弱一致性(最终一致性) 一个理想概念上的一致性,节点间数据完全一致,对外可表现为单个节点 由于网络延迟和通信等因素的存在,现实中这种一致性不可能存在 强一致性要求在全局时钟相同的条件下,对任何节点的读都相同且等于最后一次写成功的数据,这也就意味着仅仅在所有节点同步到数据后才会被标记为同步成功

2021-03-13鱼鱼
CAT的使用和原理简介
CAT的使用和原理简介开发中刚好碰到了CAT的应用,利用这篇文章总结一下
![CAT的使用和原理简介]()
2019-08-07鱼鱼
盘点redis中特殊的数据类型 HyperLogLog Bitmap
盘点redis中特殊的数据类型 HyperLogLog Bitmap 基数计数(cardinality counting)通常用来统计一个集合中不重复的元素个数,例如统计某个网站的UV,或者用户搜索网站的关键词数量 数据分析、网络监控及数据库优化等领域都会涉及到基数计数的需求 要实现基数计数,最简单的做法是记录集合中所有不重复的元素集合S_uSu,当新来一个元素x_ixi,若S_uSu中不包含元素x_ixi,则将x_ixi加入S_uSu,否则不加入,计数值就是S_uSu的元素数量 这种做法存在两个问题: 当统计的数据量变大时,相应的存储内存也会线性增长 当集合S_uSu变大,判断其是否包含新加入元素x_ixi的成本变大 大数据量背景下,要实现基数计数,首先需要确定存储统计数据的方案,以及如何根据存储的数据计算基数值;另外还有一些场景下需要融合多个独立统计的基数值,例如对一个网站分别统计了三天的UV,现在需要知道这三天的UV总量是多少,怎么融合多个统计值
![盘点redis中特殊的数据类型 HyperLogLog Bitmap]()
2022-01-12鱼鱼