- 博客(21)
- 收藏
- 关注
原创 常见笔试题型
楼主这段时间在外面看机会,前前后后面了一二线挺多互联网公司,对自己近期面试过程遇到的各种题目做一个整理,给近期看机会的同学一点参考吧。这里特别说明一下,我这里给的题只是近期我面试过程中遇到过的,至于要看机会的同学,最好还是自己要去花点时间刷刷leetcood热题,如果平时在公司不方面开lt的官网刷题,idea其实也有相应的插件,直接用idea 就可以直接刷题,自己百度下:idea leetcode插件 下载个插件直接就可以用idea 做题,非常方面。具体题目内容大家可以自己搜下leetcood.
2021-01-06 11:19:34
2551
原创 算法篇一:回溯算法
所谓的回溯,实际上就是一个决策树的遍历过程,一种选优搜索法,又称试探法。利用试探性的方法,在包含问题所有解的解空间树中,将可能的结果搜索一遍,从而获得满足条件的解。搜索过程采用深度遍历策略,并随时判定结点是否满足条件要求,满足要求就继续向下搜索,若不满足要求则回溯到上一层,这种解决问题的方法称为回溯法。经常刷leetcode的同学应该深有感触。其他的基本定义这里就不做说明了,为了方便其他人了解,这里会提供一个具体的case,然后一步步带大家深入浅出的理解回溯算法。废话不多说,直接上回溯算法框架。解决
2020-07-19 16:38:14
443
原创 java中的锁
锁从宏观上分类,分为悲观锁与乐观锁。 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。java中的乐观锁基本都是通过CAS操作实现的,...
2018-06-26 16:18:37
360
原创 Concurrenthashmap的实现原理分析
1. HashMap概述HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同)。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 值得注意的是HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Col
2018-06-04 15:37:22
30073
5
原创 线上常见问题排查之CPU过高
目前应用程序基本是Java,所以需要登录docker容器内部执行jstack命令打印堆栈信息再分析。确认目标进程执行top命令查看CPU占用情况,找出CPU占用高的进程ID。PS:输入大写P即可按照CPU占比排序进程(即 Shift + p)# top找出对应进程信息# ps -ef|grep 进程号登录容器查看容器ID# sudo docker ps -a进入容器# sudo docke...
2018-05-31 18:00:17
2118
1
原创 Quartz集群原理分析
一、Quartz概念Quartz是一个优秀的任务调度框架, 具有以下特点:强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;负载均衡高可用调度器:scheduler任务调度的控制器,负责定时任务的调度,并且提供任务和触发器的增删改查等api方法。任务:jobjob是实际被调度的任务,每个任务必须指定具体执行任务的实现类,实现类需要继承QuartzJobBean或者实现org....
2018-05-30 10:50:16
8761
4
原创 AQS实现原理
AQS(AbstractQueuedSynchronizer)即 队列同步器,是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。 同步器的主要使用方式是继承。子类推荐被定义为自定义同步组件的静态内部类,同步器自身没有实现任何同步接口,它仅仅是定义了若干同步状态获取和释放的方法来供自定义同步组...
2018-05-20 13:22:26
17028
3
原创 Redis集群
在介绍Redis的集群方案之前,我们先来谈一下数据分区的几种策略。 主要的数据分区有顺序分区和哈希分区,我们这里主要讲的是哈希分区,常见的哈希分区规则有几种,下面分别介绍: A:节点取余分区 使用特定的数据,如Redis的键或用户ID,再根据节点数量N使用公式:hash(key)%N计算出哈希值,用来决定数据映射到哪一个节点上。这种方案存在一个问题:当节点数量...
2018-05-18 15:49:59
639
原创 JAVA分布式锁的实现
为什么要使用分布式锁?为了保证一个方法在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLcok或synchronized)进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效...
2018-05-16 10:35:52
1064
转载 序列化和反序列化的底层实现原理
序列化和反序列化作为Java里一个较为基础的知识点,大家心里也有那么几句要说的,但我相信很多小伙伴掌握的也就是那么几句而已,如果再深究问一下Java如何实现序列化和反序列化的,就可能不知所措了!遥记当年也被问了这一个问题,自信满满的说了一大堆,什么是序列化、什么是反序列化、什么场景的时候才会用到等,然后面试官说:那你能说一下序列化和反序列化底层是如何实现的吗?一脸懵逼,然后回家等通知!一、基本概念...
2018-04-27 16:45:09
845
原创 Redis理解之缓存设计
缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要。下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析、缓存更新策略的选择和使用场景、缓存粒度控制方法、穿透问题优化、无底洞问题优化、雪崩问题优化、热点key重建优化。 1)缓存的收益和成本分析 下图左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构...
2018-04-24 15:23:39
4708
原创 Redis理解之单线程架构
Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务,下面来分析Redis单线程模型为什么性能如此之高。 通常来讲,单线程处理能力要比多线程差,例如有10000斤货物,每辆车的运载能力是每次200斤,那么要50次才能完成,但是如果有50辆车,只要安排合理,只需要一次就可以完成任务。那么为什么Redis使用单线程模型会达到每秒万级别的处理能力呢?可以将...
2018-04-24 13:39:08
2005
原创 Redis理解之对象类型
上篇博客提到过redis里面涉及到 字符串对象、列表对象、哈希对象、集合对象和有序对象 这五种对象类型。下面将分别对这五个对象做进一步了解。 redis对象都是由一个redisObject结构来表示的,该结构如下: 类型type包括以下五种: 编码encoding记录了对象所使用的编码,涉及到的编码如下图所示:redis中每个类型的对象最少使用两种不同的编码,下...
2018-04-03 17:50:26
672
原创 Redis理解之数据结构
我们知道redis里面的每个键值对都是有对象组成的。其中,键总是字符串对象,而值可以是字符串对象、列表对象、哈希对象、集合对象和有序对象 这五个对象的任意一种。下面将会分别介绍以上涉及到的五种对象的底层数据结构。 1)简单动态字符串(SDS) 区别于C语言的字符串,redis构建了简单动态字符串SDS作为默认的字符串表示,来看一下SDS的定义: 上左图就是SD...
2018-04-02 16:00:16
267
原创 JAVA并发理解之volatile、synchronized和lock解析
谈到并发时候,离不开JAVA的几个关键字volatile、synchronized和lock类。下面就分别介绍一下它们的实现原理、用法以及使用场景。 首先先了解一下Java内存模型的抽象示意如图所示 *每个线程都有自己的本地内存空间(java栈中的帧)。线程执行时,先把变量从内存读到线程自己的本地内存空间,然后对变量进行操作。 * 对该变量操作完成后,...
2018-03-27 16:41:55
806
原创 JAVA并发理解之重排序问题
首先我们先来了解一下什么是重排序:重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。从Java源代码到最终实际执行的指令序列,会分别经历下面3种重排序,如下图所示 上述的1属于编译器重排序,2和3属于处理器重排序。这些重排序可能会导致多线程程序出现内存可见性问题。在单线程程序中,对存在控制依赖的操作重排序,不会改变执行结果(这也是as-if-ser...
2018-03-26 20:30:49
7582
原创 JAVA并发理解之原子操作
本章主要介绍一下原子 操作的概念以及JAVA是如何保证原子性的。原子:本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。接下来让我们看一下处理器和Java里是如何实现原子操作的。 1)处理器如何实现原子操作 处理器主要是提供总线锁定和缓存锁定两个机制来保证复杂内存操作的原子性。 第一个...
2018-03-26 16:33:15
337
原创 JVM理解之垃圾回收(二)
这篇文章主要接着上篇博客针对jvm是如何进行垃圾回收的进行介绍。下面将分别介绍主要的回收算法和所用到的垃圾收集器,帮忙大家对jvm垃圾回收机制有更全面的认识。 1)垃圾收集算法 垃圾收集算法,主要包括四种分别是:”标记-清除”(Mark-Sweep)、“复制”(Copying)、“标记-整理”(Mark-Compact)、“分代收集”(Generational Col...
2018-03-23 16:02:35
262
原创 JVM理解之垃圾回收(一)
说起Java的垃圾回收机制,无非弄懂三个问题: 哪些内存需要回收? 什么时候回收? 怎么回收?下面将分别针对上面提出的问题一一解释:1)哪些内存需要回收 在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(即不可能再被任何途径使用的对象)。也就是说回收的就是所谓的已经死去的对象。下面...
2018-03-23 11:04:29
231
原创 JVM理解之运行时数据区
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁,Java虚拟机所管理的内存将会包括以下几个运行时数据区域。 1)程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器;每...
2018-03-22 15:06:33
270
原创 java设计模式
java常用设计模式理解一:什么是设计模式 设计模式是针对问题的解决方案,是套被反复使用、多数人知晓的、经过分类编目 的代码设计经验的总结。二:设计模式的作用 a:可以把它应用到特定的应用中,用于解决相似的问题 b:为了可重用代码...
2017-10-23 19:16:14
489
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人