自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(222)
  • 资源 (3)
  • 收藏
  • 关注

原创 什么是paxos算法

paxos算法原理

2022-04-02 09:24:17 402

原创 Rancher基础使用

rancher基础使用

2022-02-24 17:22:58 2026

转载 设计模式 - 外观模式

1.介绍1.1定义定义了一个高层、统一的接口,外部与通过这个统一的接口对子系统中的一群接口进行访问。1.2 主要作用实现客户类与子系统类的松耦合 降低原有系统的复杂度 提高了客户端使用的便捷性,使得客户端无须关心子系统的工作细节,通过外观角色即可调用相关功能1.3 解决的问题避免了系统与系统之间的高耦合度 使得复杂的子系统用法变得简单2.模式原理2.1 U...

2020-04-13 21:50:15 324

转载 设计模式 - 工厂模式

1、简单工厂模式  简单工厂模式其实并不算是一种设计模式,更多的时候是一种编程习惯。定义:  定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口。适用场景:  其实由定义也大概能推测出其使用场景,首先由于只有一个工厂类,所以工厂类中创建的对象不能太多,否则工厂类的业务逻辑就太复杂了,其次由于工厂类封装了对象的创建过程,所以客户端应该不关心对象的创建。...

2020-04-13 21:01:05 252

转载 Java多线程 - 线程池详解

1. 优势线程池的用处:原来是100个任务要有100个线程来执行任务,现在是100个任务我们只要几个线程就可以执行任务了。一个整合:ThreadPoolExecutor继承了AbstractExecutorService继承了ExecutorService继承了Executor。package com.roocon.thread.td4; import java.util.c...

2020-03-09 11:33:17 212

转载 Java容器 - ConcurrentLinkedQueue详解

1.简介Doug Lea在实现ConcurrentLinkedQueue时,并没有利用锁或底层同步原语,而是完全基于自旋+CAS的方式实现了该队列。回想一下AQS,AQS内部的CLH等待队列也是利用了这种方式。由于是完全基于无锁算法实现的,所以当出现多个线程同时进行修改队列的操作(比如同时入队),很可能出现CAS修改失败的情况,那么失败的线程会进入下一次自旋,再尝试入队操作,直到成功。所...

2020-03-08 19:11:26 307 1

转载 Java容器 - 阻塞队列(BlockingQueue)的实现原理

1. 简介阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。2. 操作方法...

2020-03-07 13:13:32 251

转载 Java容器 - CopyOnWriteArrayList详解

1.写入时复制(CopyOnWrite)思想写入时复制(CopyOnWrite,简称COW)思想是计算机程序设计领域中的一种优化策略。其核心思想是,如果有多个调用者(Callers)同时要求相同的资源(如内存或者是磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者视图修改资源内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到...

2020-03-07 10:52:58 141

转载 Java容器 - ArrayList详解

1.简介ArrayList是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。ArrayList类声明如下:public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io....

2020-03-07 10:16:24 191

转载 算法 - 排序 - 排序算法总结

1. 算法分类十种常见排序算法可以分为两大类:非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。比较与非比较比较:快速排序、归并排序、堆排序、冒泡排序在排序的最终结...

2020-03-05 17:24:00 138

转载 算法 - 排序 - 基数排序

1. 原理基数排序又称为“桶子法”,从低位开始将待排序的数按照这一位的值放到相应的编号为0~9的桶中。等到低位排完得到一个子序列,再将这个序列按照次低位的大小进入相应的桶中,一直排到最高位为止,数组排序完成。LSD——从低位向高位排MSD——从高位向低位排时间复杂度:O(N*digit)空间复杂度:O(N)稳定性:稳定2. 算法执行步骤(1)遍历序列找出最大的数(...

2020-03-05 16:44:01 107

转载 算法 - 排序 - 桶排序

1. 简介桶排序(Bucket sort)是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。工作原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序。9.1 算法描述设置一个BucketSize,作为每个桶所能放置多少个不同数值设置一个定量的数组当作空桶;遍历...

2020-03-05 00:33:54 139

转载 算法 - 排序 - 计数排序

1. 原理计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。...

2020-03-04 14:44:47 130

转载 算法 - 排序 - 堆排序

1. 简介堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:1.堆中某个节点的值总是不大于或不小于其父节点的值;2.堆总是一棵完全二叉树。常见的堆有二叉堆、斐波那契堆等。堆的定义:n个元素的序列{k1,k2,ki,…,kn}...

2020-03-04 13:56:26 131

转载 算法 - 排序 - 快速排序

1. 原理   快速排序,说白了就是给基准数据找其正确索引位置的过程.   如下图所示,假设最开始的基准数据为数组第一个元素23,则首先用一个临时变量去存储基准数据,即tmp=23;然后分别从数组的两端扫描数组,设两个指示标志:low指向起始位置,high指向末尾.首先从后半部分开始,如果扫描到的值大于基准数据就让high减1,如果发现有元素比该基准数据的值小(如上图中18<=...

2020-03-03 23:48:29 131

转载 算法 - 排序 - 希尔排序

1. 原理希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序是把记录按下表的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,...

2020-03-03 23:00:29 104

转载 算法 - 排序 - 插入排序

1. 原理插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。源于优先级序列:第一阶段是将为排序数据加...

2020-03-03 21:50:50 116

转载 算法 - 排序 - 选择排序

1. 原理表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。理论上讲,选择排序可能也是平时排序一般人想到的最多的排序方法了。选择排序(Selection-sort)是一种简单直观的排序算法。工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序...

2020-03-03 21:09:03 117

转载 算法 - 排序 - 冒泡排序

1. 原理冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢**“浮”**到数列的顶端。2. 算法描述比较相邻的元素:如果第一个比第二个大,就交换它们两个;对每一对相邻元素作同样的工作,从开始第一对到...

2020-03-03 20:51:13 104

转载 算法 - 排序 - 归并排序

1.基本思想归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。分而治之可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实...

2020-03-02 15:51:37 109

转载 Java多线程 - Fork/Join框架原理解析

1、概述Fork/Join Pool采用优良的设计、代码实现和硬件原子操作机制等多种思路保证其执行性能。其中包括(但不限于):计算资源共享、高性能队列、避免伪共享、工作窃取机制等。本文(以及后续文章)试图和读者一起分析JDK1.8中Fork/Join Pool的源代码实现,去理解Fork/Join Pool是怎样工作的。当然这里要说明一下,起初本人在决定阅读Fork/Join归并计算相关类的源...

2020-03-02 11:05:29 303

转载 Java多线程 - FutureTask使用及解析

1.概念FutureTask一个可取消的异步计算,FutureTask 实现了Future的基本方法,提供start cancel 操作,可以查询计算是否已经完成,并且可以获取计算的结果。结果只可以在计算完成之后获取,get方法会阻塞当计算没有完成的时候,一旦计算已经完成,那么计算就不能再次启动或是取消。2.使用场景FutureTask可用于异步获取执行结果或取消执行任务的场景。...

2020-02-29 20:41:23 529

转载 Java多线程 - Callable接口解析

1.接口的定义:public interface Callable<V> { V call() throws Exception; } 2.Callable和Runnable的异同先看下Runnable接口的定义public interface Runnable { public abstract void run();}相同...

2020-02-29 14:34:16 294 1

转载 Java多线程 - Exchanger原理和示例

1. 简介Exchanger——交换器,是JDK1.5时引入的一个同步器,从字面上就可以看出,这个类的主要作用是交换数据。Exchanger有点类似于CyclicBarrier,我们知道CyclicBarrier是一个栅栏,到达栅栏的线程需要等待其它一定数量的线程到达后,才能通过栅栏。Exchanger可以看成是一个双向栅栏,如下图:Thread1线程到达栅栏后,会首先观察有没...

2020-02-27 22:02:49 352

转载 Java多线程 - Semaphore信号量的原理和示例

1.简介Semaphore是一个计数信号量,它的本质是一个"共享锁"。信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。Semaphore的函数列表// 创建具有给定的许可数和非公平的公平设置的 Sem...

2020-02-26 23:21:43 231

转载 Java多线程 - CyclicBarrier原理

1.概述现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。在JUC包中为我们提供了一个同步工具类能够很好的模拟这类场景,它就是CyclicBarrier类。利用CyclicBarrier类可以实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续的操作...

2020-02-26 22:08:34 161

转载 Java多线程 - CountDownLatch原理

1.简介CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。CountDownLatch和CyclicBarrier的区别(01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。(02) CountDownLatch的计数器无法被重置;...

2020-02-26 21:40:07 520 1

转载 Java多线程 - InheritableThreadLocal类原理简介使用和父子线程传递数据详解

1.测试代码public class T25 { public static void main(String[] args) { //主线程中赋值 ThreadLocal<String> stringThreadLocal = new ThreadLocal<>(); InheritableThreadLoc...

2020-02-25 18:16:12 551

转载 Java多线程 - 深入解析ThreadLocal 详解、实现原理、使用场景方法以及内存泄漏防范

1.简介从名称看,ThreadLocal 也就是thread和local的组合,也就是一个thread有一个local的变量副本ThreadLocal提供了线程的本地副本,也就是说每个线程将会拥有一个自己独立的变量副本方法简洁干练,类信息以及方法列表如下2.示例在测试类中定义了一个ThreadLocal变量,用于保存Str...

2020-02-25 15:35:11 400

转载 Java多线程 - Java中的join方法原理详解

1. synchronized中的对象锁是线程的实例我们可以使用同步语句块的方式对需要同步的代码进行包裹。Object obj = new Object();synchronized(obj){obj.wait();//线程在这里等待}此时线程会在obj.wait()处等待,如果想继续执行,此时需要别的线程通过notify、notifyAll唤醒或者中断。但是如...

2020-02-25 10:31:54 464

转载 Java多线程 - Condition的实现原理

1.概述之前我们介绍AQS的时候说过,AQS的同步排队用了一个隐式的双向队列,同步队列的每个节点是一个AbstractQueuedSynchronizer.Node实例。Node的主要字段有:waitStatus:等待状态,所有的状态见下面的表格。 prev:前驱节点 next:后继节点 thread:当前节点代表的线程 nextWaiter:Node既可以作为同步队列节点使...

2020-02-23 22:57:23 153

转载 Java多线程 - wait、notify和notifyAll 详解

1、wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。2、wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。3、 由于 wait()、notify/notifyAll() 在syn...

2020-02-23 19:22:24 322

转载 Java多线程 - ReentrantReadWriteLock读写锁详解

1.读写锁简介现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,它表示两个锁,一个是读操作相关的锁...

2020-02-23 18:40:43 204

转载 设计模式 - 单例的五种实现方式

1、饿汉式(线程安全,调用效率高,但是不能延时加载):一上来就把单例对象创建出来了,要用的时候直接返回即可,这种可以说是单例模式中最简单的一种实现方式。但是问题也比较明显。单例在还没有使用到的时候,初始化就已经完成了。也就是说,如果程序从头到位都没用使用这个单例的话,单例的对象还是会创建。这就造成了不必要的资源浪费。所以不推荐这种实现方式。public class ImageLoader...

2020-02-23 16:39:50 116

转载 Java多线程 - ReentrantLock实际开发中的应用场景

1. 公平锁,线程排序执行,防饿死应用场景公平锁原则必须按照锁申请时间上先到先得的原则分配机制场景;1).实现逻辑 上(包括:软件中函数计算、业务先后流程;硬件中操作实现中顺序逻辑)的顺序排队机制的场景;软件场景:用户交互View中对用户输入结果分析类,分析过程后面算法依赖上一步结果的场景,例如:推荐算法实现[根据性别、年龄筛选]、阻塞队列的实现;硬件场景:需要先分析确认用户操作类型...

2020-02-23 15:59:22 1841

转载 Java多线程 - ReentrantLock的使用

1. 基本概念和使用可重入锁:也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。在JAVA中ReentrantLock 和synchronized 都是可重入锁;重入锁ReentrantLock 相对来说是synchronized、Object.wait()和Object.notify()方法的替代品(或者说是增强版),在JDK5.0的...

2020-02-23 15:27:04 277

转载 Java多线程 - CLH锁 、MCS锁

1.引文1.1 SMP(Symmetric Multi-Processor)对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP能够保证内存一致性,但这些共享的资源很可能成为性能瓶颈,随着CPU数量的增加,每个CPU都要访问相同的内存资源,可能导致内存访问冲突,可能会导致CPU资源的浪费...

2020-02-22 16:38:35 175

转载 Java多线程 - AQS详解

1.AQS产生背景几乎任一同步器都可以用来实现其他形式的同步器。例如,可以用可重入锁实现信号量或者用信号量实现可重入锁。但是,这样做带来的复杂性、开销及不灵活使j.u.c最多只能是一个二流工程,且缺乏吸引力。如果任何这样的构造方式不能在本质上比其他形式更简洁,那么开发者就不应该随意地选择其中的某个来构建另一个同步器。因此,JSR166基于AQS类建立了一个小框架,这个框架为构造同步器提供一种...

2020-02-22 16:08:38 163

转载 Java多线程 - 原子类操作详解

原子类的出现原因:当程序更新一个变量时,如果是多线程同时更新这个变量,可能得到的结果与期望值不同。比如:有一个变量i,A线程执行i+1,B线程也执行i+1,经过两个线程的操作后,变量i的值可能不是期望的3,而是2。这是因为,可能在A线程和B线程执行的时候拿到的i的值都是1,这就是线程不安全的更新操作,通常我们会使用synchronized来解决这个问题,synchronized能保证多线程不会...

2020-02-20 21:05:24 343

转载 Java的Unsafe类

1、Unsafe类介绍Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题。过度的使用Unsafe类会使得出错的几率变大,因此Java官方并不建议使用的,官方文档也几乎没有。Oracle正在计划从Java 9中去掉Unsafe类,如果真是如此影响就太大了。2、Unsafe的主要功能我们先来看看Unsafe的初始化方法,这是一个单例模式:pri...

2020-02-19 22:15:06 121

单项选择题系统

大学时期的工程实践 关于C语言的单项选择题系统

2015-05-08

Android API 中文/英文

里面有2个版本。新手建议用中文版。有部分介绍

2014-10-07

C++程序设计谭浩强.pdf

C++程序设计谭浩强.pdf

2014-07-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除