- 博客(43)
- 资源 (1)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 全面解析Java常用容器(从底层结构解析HashMap、ConcurrentHashMap、ArrayList、Vector、LinkedList等常用容器之间的区别和特点)
前言本篇博文主要是通过解析HashMap、ConcurrentHashMap、TreeMap、Hashtable、LinkedHashMap、HashSet、TreeSet 、ArrayList、Vector、LinkedList、BitSet、Pair等常用容器的底层结构来分析各种容器的特点、用途以及它们之间的联系和区别总览Java容器库可以分为两大类,一类是继承自Collection接口...
2020-04-22 18:54:42
3655
4
原创 ModuleNotFoundError: No module named ‘_ctypes‘ ERROR: Command errored out with exit status 1: python
问题描述Ubuntu系统下通过pip安装包时,出现ModuleNotFoundError: No module named ‘_ctypes’ ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output错误。问题分析这是因为缺少了外部函数库(libffi)的开发链接库软件包,所以在安装pip的时候就报了"ModuleNotFoundError
2020-08-16 18:11:48
917
1
转载 Java动态追踪技术探究
引子在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在为一件事情苦恼,程序出问题了,一时看不出问题出在哪里,于是有了以下对话:“Debug一下吧。”“线上机器,没开Debug端口。”“看日志,看看请求值和返回值分别是什么?”“那段代码没打印日志。”“改代码,加日志,重新发布一次。”“怀疑是线程池的问题,重启会破坏现场。”长达几十秒的沉默之后:“据说,排查问题的最高境界,就是只通过Review代码来发现问题。”比几十秒长几十倍的沉默之后:“我轮询了那段代码一十七遍之后,终于得出一个结论。
2020-06-03 15:02:20
258
原创 代理模式-静态代理和动态代理的那些事
代理模式代理模式用于为其他对象提供一种代理以控制对这个对象的访问,代理模式中分为代理对象和委托对象(被代理对象),就如同经纪人和艺人的关系,广告商想要某位艺人代言,不直接与艺人联系,而是通过与经纪人取得联系来获得艺人的代言。代理模式中的一个重要特征就是代理对象和委托对象必须实现同一接口,万物互联,这就好比现实中经纪人和艺人往往属于同一家公司。代理对象不提供直接服务,而是调用委托对象的服务,除了调用对象的服务,代理对象会进行一些预处理消息、消息过滤、服务事后处理等扩展服务,就好比经纪人肯定不是遇到广告商的业
2020-06-02 22:44:14
255
原创 当线程池中的一个线程出现异常,那它该何去何从
1、execute()方法是不会有返回值的,当任务的执行方式是execute时,可以看到堆栈异常的输出,因为该方法内部将异常抛出。而当执行方式是submit时,堆栈异常没有输出,它不抛出异常而是将异常进行了保存,丢到了Future对象中,返回Future对象。调用Future.get()方法时,可以捕获到异常,可以让我们更容易的处理异常。(题外话— execute只能接受Runnable类型的任务,submit不管是Runnable还是Callable类型的任务都可以接受)2、线程池中某个线程出现异常,它
2020-05-28 12:12:17
1044
原创 当try、catch、finally中有return时,程序该如何执行?
try、catch中有return,而finally中没有return1、首先说明下,无论try、catch中是否有return,无论是否产生异常,finally代码是一定会执行的,代码验证如下: public int handleTest1(){ int b=0; try{ System.out.println("try"); int a=10/0; System.out.println("t
2020-05-28 09:56:25
466
转载 高并发网站架构演进之路
概述本文以淘宝作为例子,介绍从一百个到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则。特别说明:本文以淘宝为例仅仅是为了便于说明演进过程可能遇到的问题,并非是淘宝真正的技术演进路径基本概念在介绍架构之前,为了避免部分读者对架构设计中的一些概念不了解,下面对几个最基础的概念进行介绍:(1)分布式系统中的多个模块在不同服务器上部署,即可称为分布式系统,如Tomcat和数据库分别部署在不同的服务器
2020-05-21 11:30:43
281
转载 分布式限流算法以及实战
限流的作用由于API接口无法控制调用方的行为,因此当遇到瞬时请求量激增时,会导致接口占用过多服务器资源,使得其他请求响应速度降低或是超时,更有甚者可能导致服务器宕机。 限流(Rate limiting)指对应用服务的请求进行限制,例如某一接口的请求限制为100个每秒,对超过限制的请求则进行快速失败或丢弃。限流可以应对:(1)热点业务带来的突发请求;(2) 调用方bug导致的突发请求;(3) 恶意攻击请求。因此,对于公开的接口最好采取限流措施。分布式限流的优势当应用为单点应用时,只要应用
2020-05-19 16:37:54
443
4
原创 Zookeeper原理以及要点知识
ZookeeperZookeeper简述Zookeeper是一个分布式服务框架,是Apache Hadoop 的一个子项目,它提供的是分布式协调服务。用来解决分布式应用中经常遇到的一些数据管理问题,比如统一命名服务、协调锁资源、状态同步服务、集群管理、分布式应用配置项的管理等。而Zookeeper实现这些功能的支撑其实是它类似于文件系统的数据模型和监听机制。监听机制客户端可以通过在它关心的目录节点上注册监听事件监听器(Watcher),当目录节点发生相应的事件(数据改变、节点被删除、子目录节点增加
2020-05-14 11:33:44
325
原创 CentOS8服务器安装Mysql并设置远程连接
过程安装1、通过以下命令,使用最新的包管理器安装MySQL(安装过程中一直yes/y即可)sudo dnf install @mysql2、设置MySQL自动启动sudo systemctl enable --now mysqld3、检查MySQL是否在运行sudo systemctl status mysqld结果:(如图显示active,则表明MySQL已经安装成功且正在运行,接下来进行安全性、远程连接等配置)安全性配置4、运行mysql_secure_installati
2020-05-09 09:03:17
2465
1
转载 单调栈以及应用(含leetCode第42题接雨水代码)
单调栈定义单调栈的定义:元素值满足单调性的栈结构。与单调队列相比,其只在一端进行进出。递增栈是栈顶到栈底依次递增。插入过程中,保持栈内一直是单调性,将不满足的元素pop出栈,直接丢弃。如下图,分别插入6,10,3,7,4,12的时候,单调递增栈和单调递减栈的情况分别是样子的:应用场景解决的是以某个值为最小(最大)值的最大区间,递增栈能表示入栈元素左边第一个比它大的元素,递减栈能表示入栈...
2020-05-02 22:09:34
358
原创 跳跃表原理以及实现(含ConcurrentSkipListMap和zset底层实现原理分析)
前言我们常用来加快查找速度的两类数据结构分别是哈希表和平衡树,哈希表查找时间复杂度是O(1),而各类平衡树(包括红黑树)的查找时间复杂度是O(logn)。哈希表虽然查找速度快,但它不是有序的,无法进行范围查询;平衡树虽然也很香,但它每一次的插入和删除都可能导致全局调整,耗时多。而本篇博文介绍的跳跃表查找的效率与平衡树差不多,时间复杂度都是O(logn),但插入或者删除值时,只是局部调整,过程简单...
2020-05-01 21:14:58
1954
原创 盘点论文免费下载的国内外网站
前言查找、下载论文,我们一般会想到知网或者百度学术,但在这些地方下载论文都需要积分,因此这里推荐几个免费下载或者免费提供积分的网站国内上海研发公共服务平台(推荐)链接: http://www.sstir.cn网站有知网和万方等知名论文库的搜索引擎。并且提供了 1400 元的论文下载基金,登录即可领取。我本人使用的就是这个,用起来还不错。贵州数字图书馆链接: http:...
2020-04-29 13:30:06
1432
原创 Redis事务(Redis事务与普通关系型数据库事务的区别)
前言Redis作为非关系型数据库中的一种,因为其基于内存、单线程、支持持久化、拥有着高速的读写速度而又支持多种数据类型、支持原生集群等特点而被广泛使用。这篇博文主要讨论下Redis事务与关系型数据库(比如MySQL)事务之间的区别。Redis事务Redis事务与MySQL事务一样,一次事务可以执行多条命令,在事务执行时命令按顺序执行。由MULTI命令标志着事务的开始,EXEC命令标志着开始执...
2020-04-26 13:25:23
1482
4
转载 MySQL大表优化方案(当数据库表数据量过大造成CRUD操作性能很差时该如何优化)
前言当MySQL单表记录数过大时,增删改查性能都会急剧下降。可以通过单表优化、限定数据的范围、表分区、读写分离等方法进行优化。这篇文章主要内容是转载的博主manong,原文传送门 ,然后自己进行了一些修改。单表优化这块方法不是太全可以翻阅我的其它相关博文-----《MySQL高性能优化规范(这应该是我见过写的最好的优化规范建议了)》和《解析SQL语句执行速度慢的原因(SQL性能优化)》单表优化...
2020-04-17 16:42:29
3765
1
原创 InnoDB的MVCC实现原理(InnoDB如何实现MVCC以及MVCC的工作机制)
MVCC(多版本并发控制)使用锁和锁协议来实现相应的隔离级别来进行并发控制,味道虽好但因为锁会造成事务阻塞,导致并发性能会受到一定的影响。而多版本并发控制使得对同一行记录做读写的事务之间不用相互阻塞等待(写写还是要阻塞等待,因为事务对数据进行更新时会加上排他锁),提高了事务的并发能力,可以认为MVCC是一种解决读写阻塞等待的行级锁。MVCC的一些重要特性(1)MVCC只支持RC(读取已提交)...
2020-04-16 21:45:28
6952
2
原创 解析数据库锁协议和InnoDB锁机制(全面解析行级锁、表级锁、排他锁、共享锁、悲观锁、乐观锁等常用锁)
前言数据库通过锁以及锁协议来进行并发控制,解决并发事务带来的问题,本篇博文主要是解析数据库的锁协议和锁机制。锁协议在介绍锁之前,我先介绍下锁协议,锁协议规定了何时加锁、释放锁的规则,不同的规则可用于实现不同的隔离级别,解决不同的并发事务问题。一级封锁协议:更新数据前需要先加X锁,直到事务结束才释放X锁,读数据是不需要加S锁。所以只能解决第一类更新丢失问题,不能解决脏读和不可重复读等问题。...
2020-04-16 16:53:04
3922
原创 解析事务隔离(事务隔离是如何解决脏读、幻读、不可重复读等问题)
前言锁机制和索引是数据库两块极其重要的知识点,也是面试中面试官最爱问的两个部分。前面的文章已经对索引知识有了一个较为全面的解析,这篇文章主要从并发事务的角度出发,解析并发事务带来的问题,以及事务隔离是如何解决并发事务带来的问题。事务事务存在意义是保证数据的一致性。事务保证了事务内的一系列操作,要不都执行,要不都不执行。例如A账号给B账户转账10000,则A账号减去10000,B账号增加100...
2020-04-13 20:17:56
1501
1
原创 解析SQL语句执行速度慢的原因(SQL性能优化)
前言本篇文章主要是通过数据库锁机制和索引来分析SQL语句执行速度慢的原因。偶尔执行速度慢如果一条SQL语句绝大多数时候执行速度正常,偶尔执行慢。那么可能是因为产生了锁竞争,也可能是数据库为了保持数据一致性,在将数据从日志中刷新到磁盘上。锁竞争锁因为事务并发会带来脏读、修改丢失、不可重复读、幻读等问题,所以数据库需要使用锁机制保证数据一致性。数据库常用的锁级别有行级锁、页级锁、表级锁,因...
2020-04-06 16:22:09
5516
转载 MySQL高性能优化规范(这应该是我见过写的最好的优化规范建议了)
前言这篇文章几乎所有内容都是转载,转载的作者是听风,原文地址: https://www.cnblogs.com/huchong/p/10219318.html。然后自己在里面添加修改了些内容,并且这篇文章内涉及到了聚集索引、覆盖所有、冗余索引等知识,若不是很了解,可以看我的另外一篇博文:《全面解析数据库索引(数据库索引种类大盘点)》)数据库命令规范•所有数据库对象名称必须使用小写字母并用下划...
2020-04-05 23:08:41
807
原创 全面解析数据库索引(数据库索引种类大盘点)
前言前面两篇文章 《解析B+树比B树更加适合做数据库索引的原因 》 和《从底层解析B+索引提高查询速度的原因》是从数据结构的角度分析了B+索引,并分别介绍了B+索引在两个主流存储引擎InnoDB和MyISAM中的实现。而这篇文章是全面的介绍索引,介绍使用索引的利弊、索引使用时需要注意什么、索引的种类等等。索引的定义索引是数据库中用来加快检索速度的数据结构,常用的索引有B+索引和hash索引以...
2020-04-04 21:37:15
2796
原创 从底层解析B+索引提高查询速度的原因
前言我的上篇文章《解析B+树比B树更加适合做数据库索引的原因》介绍了为什么B+树更适合做索引,并以InnoDB和MyISAM存储引擎介绍了聚集索引和非聚集索引的区别。Mysql默认的存储引擎是InnoDB,因此此篇文章主要以InnoDB的数据页结构以及数据页结构之间的连接方式和查找过程来说明B+索引提高查询速度的原因。数据页结构Mysql进行数据存储的基本结构是数据页(也可称作块),一页的大...
2020-04-03 22:08:59
1423
原创 解析B+树比B树更加适合做数据库索引的原因
前言数据库常用的索引有Hash索引、BTree索引 、全文索引。Hash索引虽然等值查询会很快(单条记录查询),但其无法进行有效的范围查询,而范围查询是数据库的常用操作,因此很多存储引擎更倾向于使用BTree索引,例如MyISAM与InnoDB 都是默认使用BTree索引(它们的一个区别是InnoDB使用聚集索引,而MyISAM使用非聚集索引)。本文主要是讨论B+树与B树结构差不多,为什么会用B...
2020-03-30 21:33:29
2510
原创 通过分析类加载过程来解析Java的静态变量、静态方法、静态代码块、代码块、构造器执行顺序
一、 前言本篇文章主要是通过解析类加载过程来验证子父类之间的静态方法、静态代码块、普通方法、代码块、构造器的执行顺序。二、 类加载过程类加载指的是在程序运行期将类数据从Class文件加载到内存中,最终形成可以被虚拟机直接使用的Java类型,整个过程包括加载、连接(验证、准备、解析)、初始化5个阶段。类加载的时机在开始类加载过程讲述之前,先聊一聊类加载是什么时候开始的。虚拟机没有规定什么时...
2020-03-30 12:17:40
898
原创 布隆过滤器是什么?(布隆过滤器原理解析)
前言布隆过滤器是一种用来检索数据是否在大集合中的高效的、空间占用少的概率型数据结构,该数据结构由哈希函数以及位数组(二进制向量)来实现的,一般而言,布隆过滤器支持add 和 isExist 操作。过滤器使用场景1、布隆过滤器主要用于判断给定数据是否存在大数据集中。可以用来防止缓存穿透、邮箱的垃圾邮件过滤、黑名单功能等等。利用布隆过滤器可以很有效的减少磁盘 IO 或者网络请求,因为一旦一个值必...
2020-03-25 14:05:41
509
原创 解析乱码产生的原因
编码与解码编码-将字符转换为对应的二进制序列解码-编码的逆过程,按照编码的规则将二进制序列转换成字符为什么需要编码和解码先小小的举个例子,你现在所看到的这篇文章都是一个个文字组成,这些文字在计算机内存中是以二进制序列的形式存在着的。将内存中的二进制序列转换成我们人眼可见的这些文字、英语符号这个过程就是解码,反之把可见的文章的内容转换成内存中二进制序列信息就叫编码。详细过程:当你点击链接时...
2020-03-12 14:59:15
1017
原创 解析Java中的值传递
C++中在进行参数传递时,分为按值传递、引用传递(&)、按指针传递(*),需要自己指定参数传递类型。但JAVA表面上只有值传递,但真的只是值传递吗?其实并非如此,Java中也分为按值传递、按引用传递,只是传递类型按照传入参数的类型而定。传递类型定义1、值传递:在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,修改的将是参数副本,将不会影响到实际参数。2、引用...
2020-03-07 15:02:38
373
原创 Synchronized关键字和锁优化
多线程编程中,我们往往使用synchronized关键字以ReentrantLock类来实现线程安全,二者都是基于互斥同步的方式来保障并发安全性,且都可重入。尽管最基本的互斥同步手段是synchronized关键字,它是原生语法层面的互斥锁,而ReentrantLock是API层面的互斥锁;但在JDK1.6之前,synchronized关键字的性能远远不如ReentrantLock。但在1.6以及...
2020-03-02 19:23:34
654
原创 基于视频的实时人脸识别(含代码)
介绍思路介绍无论是基于视频或者调用摄像头来完成人脸识别,其实是一样,通过使用opencv,来捕获视频或者摄像头传来的图像,每隔若干帧取一帧做人脸识别,调用Dlib中的人脸检测器来检测人脸,并通过Dlib的人脸关键点预测器来获得人脸的关键点,接下来使用Dlib的面部识别模型将获得的68个关键点转换成128D面部描述符,我们通过计算人脸的128D面部描述符与本地人脸库(需要自己建立人脸库)中的人脸...
2020-02-19 20:35:20
27999
10
原创 Java内存模型和Volatile关键字
前言学习并发关键在于学会解决并发过程中线程通信以及线程同步中出现的问题,线程通信有两类机制,一是共享内存,另一个是消息传递。JAVA使用的是第一种,通过在共享内存中进行读写来进行消息传递,在共享内存中,线程通信是隐性的,对编程人员是透明的,因此容易出现可见性问题;线程同步则是显性的,需要编程人员来指定线程之间的互斥以及同步。高效并发系列皆是围绕着介绍虚拟机如何实现线程、多线程之间由于共享和竞争数...
2020-02-15 22:16:26
371
原创 Java的String解密
字符串运行时常量池的所在地JDK1.6之前,字符串常量池还未与其它常量池分离,都位于永久代中(方法区的实现方式),JDK1.7虽然还未废除永久代,但此时字符串常量池和静态变量已经离开了常量池,去了堆中。JDK1.8已经废除常量池,取而代之的是元空间(元空间不再位于虚拟机中,而是处于本地内存中),其它常量池和类信息都去了元空间,而字符串常量以及静态变量存在堆中。String类型的各种初始化方式的...
2019-11-27 12:32:47
437
原创 Ubuntu服务器配置Redis集群
最近无心科研,所以脑袋瓜一抽,就来学习了下redis,配置redis集群当然是必备操作了,这里我使用的是ubantu服务器,可能是菜鸡本鸡吧!每次搭配环境或者配置软件都会疯狂采坑,这里希望我的经历能给其它菜鸡同仁一点经验帮助吧!如果有什么遗漏的,请评论下指出,谢谢!
2019-11-23 20:19:57
829
原创 Win10电脑在Anaconda虚拟环境+python3.7+cuda10.0中安装pytorch(离线)
前言:因为需要用到pytorch框架,所以我这个新手就来尝试用conda直接从官网下载下来,但由于本人人品过于差,安装了清华源,下载还是的慢的一批,然后下一点就直接失败,然后尝试了翻墙,还是失败。安装了两天,一直失败,心态微崩,然后就想到使用离线安装,很快就安装好了。希望我的这篇文章能给需要的人一点帮助。第一步、去pythoch官网把你需要的whl文件下载下来,我在此提供了两个链接如下:...
2019-11-04 22:13:12
1358
1
原创 git的使用(一)--新手如何将本地项目上传到github上面。
方法一 从github上入手1.注册github账号2.创建仓库--点击start a Repository(还有其它方法)3.然后将仓库地址进行克隆(有两种地址,一种是HTTPS,另外一种是SSH,建议第二种,原因下述)4.在你的项目目录下(即项目文件夹下)进行本地仓库连接4.1 在你的项目目录下右击 打开git Bash,进入命令行4.2 输入 git clon...
2019-10-29 10:35:18
2818
原创 eclipse核查导入的架包是否有误
1.点击--show view2.输入--breakpoints3.点击Add Java Exception Breakpoint(带有J!符号的标志)4.输入ZipException5.停止服务器,debug运行服务器,若jar包出错,则会提醒。若不是架包出错则不会提醒。...
2018-04-27 16:19:38
324
原创 解析Java中的四种引用
1.强引用---即使是内存不足,垃圾回收器也不会回收被强引用的对象的内存。(会报OOM异常)2.软引用---只有在内存快溢出的时候,垃圾回收器才会回收被其引用的对象的内存。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。适合用来实现缓存:比如网页缓存、图片缓存等。 SoftRefer...
2018-04-20 14:43:45
322
原创 JAVA笔记-IO流
1. ByteArrayOutputStream--字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。创建字节数组缓冲区 无参数传入时为32字节 2. ObjectOutputStream--对象的输出流将指定的对象写入到文件的过程,也就是将对象序列化的过程。 3. ReadObject方法用来从流中读出对象的状态信息。读出时必须使用与写入对象时相同的...
2018-04-13 17:18:48
257
原创 原型模式-JAVA实现深克隆的两种方式(通过重写clone方法和序列化反序列化实现深克隆)
一.原型模式介绍A.优点:当创建新的对象实例较为复杂时,使用原型模式可以简化的对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率。原型模式允许动态增加或减少产品类。原型模式具有给一个应用软件动态加载新功能的能力。 产品类不需要非得有任何事先确定的等级结构 。B.缺点:原型模式的最主要缺点就是每一个类必须配备一个克隆方法。而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难...
2018-04-13 17:15:53
1875
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人