
编程基础
风筝Lee
儿时,你是父母手中的风筝;上学了,你是老师手中的风筝;工作了,你是领导手中的风筝;成家了,你是妻子手中的风筝;老时,你是子女手中的风筝。人生就像风筝,总有一根线牵着你,或长、或短,或紧、或松;你在这头,爱你的人就在那头。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
跳跃表(skiplist)
跳跃表(SkipList)是一种能高效实现插入、删除、查找的内存数据结构,这些操作的期望复杂度都是O(logN)。与红黑树以及其他的二分查找树相比,跳跃表的优势在于实现简单,而且在并发场景下加锁粒度更小,从而可以实现更高的并发性。正因为这些优点,跳跃表广泛使用于KV数据库中,诸如Redis、LevelDB、HBase都把跳跃表作为一种维护有序数据集合的基础数据结构。众所周知,链表这种数据结构的查询复杂度为O(N),这里N是链表中元素的个数。在已经找到要删除元素的情况下,再执行链表的删除操作其实非常高效,转载 2020-12-14 22:27:05 · 3551 阅读 · 0 评论 -
聊聊java的Fork/Join框架
背景某日线上hdfs集群namenode状态切换出现长时间延迟情况,排查zkfc log发现有调用namenode 的切换状态的rpc方法超时的报错。通过打印切换过程时的火焰图发现几乎所有的调用时间都花费在了递归更新namespace quota上。梳理具体的代码逻辑,namenode端处理zkfc transitionToActive切换状态请求,需要保证所有的editlog已加载完成,并调用递归方法updateCountForQuotaRecursively更新整个fsimage下的配额和使用量信.原创 2020-12-13 01:08:12 · 288 阅读 · 0 评论 -
浅谈copy-on-write
写入时复制(Copy-on-write)是一个被使用在程序设计领域的最佳化策略。其基础的观念是,如果有多个呼叫者(callers)同时要求相同资源,他们会共同取得相同的指标指向相同的资源,直到某个呼叫者(caller)尝试修改资源时,系统才会真正复制一个副本(private copy)给该呼叫者,以避免被修改的资源被直接察觉到,这过程对其他的呼叫只都是通透的(transparently)。此作法主要的优点是如果呼叫者并没有修改该资源,就不会有副本(private copy)被建立。--百度百科简介.原创 2020-12-11 21:44:01 · 1411 阅读 · 0 评论 -
聊聊自旋锁
自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,即在标志寄存器中关闭/打开中断标志位,不需要自旋锁)。---百度百科背景由于在多处理器环境中资源的有限性和并发安全问题,很多时候需要进行互斥访问(mutual exclusion),所以需要引入锁的机制,只有获取了锁的线程才能够对资源进行访问,由于多线程运行是依赖cpu的时间分片,所以同一时刻只能有一个线程获取到锁。那么没有获取到锁的线程通常有两种方式.原创 2020-11-29 22:44:05 · 1470 阅读 · 0 评论 -
SMP、NUMA、MPP体系结构
前言:系统的性能很大程度上依赖于cpu 硬件架构的支持,所以了解cpu不同架构体系对开发人员优化性能非常重要,且可以通过学习相关的架构体系,借鉴或者应用到开发架构上。本篇内容参考和摘录一些技术博客进行整理,如有错误之处欢迎指正。从系统架构来看,目前的商用服务器大体可以分为三类,即对称多处理器结构(SMP :Symmetric Multi-Processor) ,非一致存储访问结构 (NUMA :Non-Uniform Memory Access) ,以及海量并行处理结构 (MPP :Massive P.原创 2020-11-29 22:40:12 · 2753 阅读 · 1 评论 -
避免和预防死锁的方式
前言本篇文章首先介绍下死锁相关的的概念,产生原因和四个必要条件,然后说明下避免和预防死锁的方式;什么是死锁死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。例如,在某一个计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。..转载 2020-07-23 13:49:22 · 3756 阅读 · 0 评论 -
常见容错机制:failover、failfast、failback、failsafe
1.failover:失效转移Fail-Over的含义为“失效转移”,是一种备份操作模式,当主要组件异常时,其功能转移到备份组件。其要点在于有主有备,且主故障时备可启用,并设置为主。如Mysql的双Master模式,当正在使用的Master出现故障时,可以拿备Master做主使用2.failfast:快速失败从字面含义看就是“快速失败”,尽可能的发现系统中的错误,使系统能够按照事先设定好的错误的流程执行,对应的方式是“fault-tolerant(错误容忍)”。以JAVA集合(Collection)转载 2020-07-07 16:21:12 · 952 阅读 · 0 评论 -
设计模式六大原则
设计模式六大原则:单一原则、里氏替换原则、依赖倒置原则、接口隔离、迪米特原则、开闭原则;1.单一原则(Single Responsibility Principle):一个类或者一个方法只负责一项职责,尽量做到类的只有一个行为原因引起变化;业务对象(BO business object)、业务逻辑(BL business logic)拆分;2.里氏替换原则(LSP liskov substitution principle):本质是指多态性,子类可以扩展父类的功能,但不能改...原创 2020-06-24 10:30:26 · 207 阅读 · 0 评论 -
设计模式六大原则:开闭原则
开闭原则(Open Close Principle):Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification. 软件对象(类、模块、方法等)应该对于扩展是开放的,对修改是关闭的。比如:一个网络模块,原来只有服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,转载 2020-06-24 10:25:59 · 255 阅读 · 0 评论 -
Java匿名内部类
内部类:在一个类中定义另一个类,这样定义的类称为内部类。【包含内部类的类可以称为内部类的外部类】 如果想要通过一个类来使用另一个类,可以定义为内部类。【比如苹果手机类,苹果手机类中的黄金版的是特别定制的】 内部类的外部类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外部类中的方法。【不论是静态还是非静态的,内部类都可以直接调用外部 内部类的类体中不可以声明类变量和类方法 内部类可以由外部类使用外部类中在函数中创建内部类对象来使用,如果内部类的权限是非私有,非静态的,就可以在外部其他程序中原创 2020-06-07 10:21:15 · 220 阅读 · 0 评论 -
lock()与lockInterruptibly()
ReentrantLock相关源码: public void lock() { sync.lock(); } public void lockInterruptibly() throws InterruptedException { sync.acquireInterruptibly(1); } /** ...转载 2020-05-07 14:16:43 · 397 阅读 · 0 评论 -
数据结构面试题-链表篇(java实现)
链表数据结构:class ListNode { ListNode next; int val; ListNode(int x){ val = x; next = null; }}1. 翻转链表: //翻转链表(遍历方式) ListNode reverse(ListNode node){ Li...原创 2020-04-18 21:42:03 · 289 阅读 · 0 评论 -
java经典面试题之多线程通讯方式
简单整理下,后续进行更新。。。。。java多线程通讯一般实现起来有如下几种方式:一、传统线程通信synchronized + wait + notifyObject类的wait()、notify() 、notifyAll()三个方法必须由同步监视器对象来调用,分两种情况:a)同步方法,该类默认实例(this)就是同步监视器,可以在同步方法中可以直接调用b)同步代码块,同步监视器...原创 2020-04-12 10:15:31 · 246 阅读 · 0 评论 -
maven项目打包[包含所有引入的依赖]
maven项目打包[包含所有引入的依赖] : 将项目所有的文件,包括pom文件中依赖的jar包都打进一个jar包里面。具体操作:1.maven项目的pom文件添加配置:<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</art...原创 2019-11-26 10:22:57 · 1826 阅读 · 0 评论 -
log4j:WARN No appenders could be found for logger
使用log4j时不起作用,每次执行类时出现以下提示:log4j:WARN No appenders could be found for loggerlog4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#nocon...原创 2019-11-26 10:09:25 · 238 阅读 · 1 评论 -
归并排序复习
归并排序:归并排序的思想:1.将待排序的线性表不断地切分成若干个子表,直到每个子表只包含一个元素,这时,可以认为只包含一个元素的子表是有序表。2. 将子表两两合并,每合并一次,就会产生一个新的且更长的有序表,重复这一步骤,直到最后只剩下一个子表,这个子表就是排好序的线性表。这里面就用到了非常重要的分治思想,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问...原创 2019-11-16 14:20:51 · 184 阅读 · 0 评论 -
数据结构复习之skiplist
skiplist简介skip List是一种随机化的数据结构,基于并联的链表,实现简单,插入、删除、查找的复杂度均为O(logN)(大多数情况下),因为其性能匹敌红黑树且实现较为简单,因此在很多著名项目都用跳表来代替红黑树,例如LevelDB、Redis的底层存储结构就是用的SkipList。目前常用的key-value数据结构有三种:Hash表、红黑树、SkipList,它们各自有着不同...转载 2019-11-11 15:50:18 · 568 阅读 · 0 评论 -
进程、线程和协程的理解
转自:https://www.cnblogs.com/guolei2570/p/8810536.html一、进程进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进...转载 2019-04-01 12:46:00 · 226 阅读 · 0 评论 -
ThreadLocalRandom代码分析
ThreadLocalRandom类:ThreadLocalRandom类是JDK7在JUC包下新增的随机数生成器,它解决了Random类在多线程下多个线程竞争内部唯一的原子性种子变量而导致大量线程自旋重试的不足。首先讲解下Random类的实现原理已经它在多线程下使用的局限性,然后引入ThreadLocalRandom类,通过讲解ThreadLocalRandom的实现原理来说明ThreadL...转载 2019-04-08 19:12:19 · 324 阅读 · 0 评论 -
Kerberos工作原理介绍
Kerberos协议参考英文网站,可知Kerberos(也称为Cerberus)来自古希腊神话中,指一个有三个头的狗,阻止活着的入侵者进入地下世界。Kerberos协议以此命名,其中三个组成部分为:Client、Server、KDC(密钥分发中心)。1. 简单的相互身份验证A向B发送信息时,会附加一个Authenticator(认证码,该数据结构=身份信息+时间戳)来进行彼此的身...转载 2019-04-09 15:20:54 · 1388 阅读 · 0 评论 -
设计模式复习之装饰器模式
一. 装饰器模式(摘录)装饰器模式又称为包装(Wrapper)模式。装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类的方式并不可取,在面向对象的设计中,我们应该尽量使用组合对象而不是继承对象来扩展和复用功能,装饰器模式就是基于对象组合的方式的...转载 2019-05-06 18:55:41 · 164 阅读 · 0 评论 -
设计模式复习之单例模式
单例模式:保证同一个类只有一个对象实例;主要复习三种实现方式:饿汉、饱汉、双重校验锁1.饿汉模式:/** * 单例模式之饿汉模式 * 类加载时即创建实例对象 * */public class SingletonA { private static SingletonA singleton = new SingletonA(); private Singleton...原创 2019-05-16 09:22:13 · 122 阅读 · 0 评论 -
java8函数式编程学习
目录:1. 函数式编程介绍2.Lambda表达式3.函数式接口一.函数式编程介绍面向对象编程的思想是对数据进行抽象,而面向函数编程的思想是对行为方法进行抽象。函数式编程的好处主要有:1.函数式编程可以减少业务逻辑和代码的分歧。他允许我们再更高层次更自然的描述业务逻辑。2.许多样板可以被移除,这会让代码更清晰和简洁。3.高阶函数允许我们:发送方法到其他方法...转载 2019-05-27 11:51:15 · 253 阅读 · 0 评论 -
java设计模式之Template Pattern---复习篇
目录:1.模版模式介绍2.模版模式原理3.模版模式使用一.模版模式介绍定义:定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的...原创 2019-06-10 11:59:40 · 191 阅读 · 0 评论 -
Intellij IDEA 中生成JAR包及导出
具体操作流程:1、右键具体的项目点击Open Module Setting2、选择Artifacts—->点击绿色的“+”3、选中jar—>From modules with dependencies4、注意Main Class的添加,此处就是选择你要生成的jar包的工程文件5、.MF文件就是你生成jar包生成的签名信息,第一次生成jar包,会生成相应的.MF签...原创 2019-07-02 20:24:23 · 2482 阅读 · 0 评论 -
将本地jar包放入到maven本地仓库和远程仓库
1.将本地jar包放入本地仓库。只需执行如下命令即可:mvn install:install-file -Dfile=D:/demo/fiber.jar -DgroupId=com.sure -DartifactId=fiber -Dversion=1.0 -Dpackaging=jar 打开本地maven仓库所在目录即可看到被添加的本地jar包。2.将本地jar包放入远程私服...转载 2019-07-31 18:05:51 · 2037 阅读 · 1 评论 -
BitMap算法详解
所谓的BitMap就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间。基本思想: 这此我用一个简单的例子来详细介绍BitMap算法的原理。假设我们要对0-7内的5个元素(4,7,2,5,3)进行排序(这里假设元素没有重复)。我们可以使用BitMap算法达到排序目的。要表示8个数,我们需要8个byte。...转载 2019-09-24 14:14:33 · 138 阅读 · 0 评论 -
信号量和互斥量(锁)的区别
信号量:那是多线程同步用的,一个线程完成了某一个动作就通过信号告诉别的线程,别的线程再进行某些动作。互斥量:这是多线程互斥用的,比如说,一个线程占用了某一个资源,那么别的线程就无法访问,知道这个线程离开,其他的线程才开始可以利用这个资源。信号量与普通整型变量的区别:信号量(semaphore)是非负整型变量,除了初始化之外,它只能通过两个标准原子操作:wait(semap), sign...转载 2019-03-27 14:55:21 · 1226 阅读 · 0 评论