自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 spring创建bean详解总结

spring三级缓存,创建bean过程详解

2022-08-26 12:56:31 267 2

转载 数据库核心日志详解

MySQL数据库日志

2022-08-25 12:57:50 1295

转载 轻松理解Hbase面向列的存储

Hbase列存储原理

2021-12-03 11:32:32 2924 1

原创 递归算法要素

递归算法的三个要素。每次写递归,都按照这三要素来写,可以保证写出正确的递归算法!1. 确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。2. 确定终止条件:写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。3. 确定单层递归的逻辑:确定每一层

2020-10-14 16:17:26 2729

原创 缓存与数据库双写不一致解决方案

前提保证最终一致性的解决方案是缓存设置过期时间。一下方案讨论的是不依赖于给缓存设置过期时间的情况。方案一:先更新缓存,再更新数据库不推荐。先更新缓存若更新数据库失败,还需再更新缓存。方案二:先更新数据库,再更新缓存不推荐。同时有请求A和请求B进行更新操作,请求A与B在不同线程,可能会出现:请求A更新了数据库 请求B更新了数据库 请求B更新了缓存 请求A更新了缓存这就出现请求A更新缓存应该比请求B更新缓存早才对,但是因为网络等原因,B却比A更早更新了缓存。这就导致了脏数

2020-09-24 22:24:29 1150

原创 搭载微服务架构要将会遇到的四个问题?

1.客户端如何访问这么多的微服务?2.服务与服务间如何通信?3.服务如何管理(服务治理)?4.服务挂了怎么办?解决方案:1.springboot+springcloud(基于http)2.springboot+dubbo+zookeeper(基于RPC)...

2019-09-23 22:56:11 149

原创 机器学习实战(1):K-近邻算法

1.本文将从k-近邻(kNN)算法的思想开始讲起,使用python一步一步编写代码进行实战训练。除此之外,本文也对sklearn实现k-近邻算法的方法进行了讲解。实战实例:电影类别分类、约会网站配对效果判定、手写数字识别。算法简介:k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理是:存在一...

2019-04-05 21:35:32 671

原创 线程并发并行协作之生产者消费者模式

应用场景:假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的的产品取走消费;如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,知道仓库中的产品被消费者取走位置;如果仓库中放有产品,则消费者将产品取走消费,否则停止消费并等待,知道仓库中再次放入产品为止。分析:这是一个线程同步问题,生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖...

2019-02-22 19:25:59 603

原创 Java 中为什么不能创建泛型数组?

effective java中有明确的说明,java中由于类型擦除,为了保证类型安全,所以编译器不允许泛型数组的创建。// 假设可以创建泛型数组List<String>[] stringLists = new ArrayList<String>[1];List<Integer> intList = Arrays.asList(42);// 泛型擦除,...

2019-01-11 17:31:54 574

原创 Java问题之Exception和Error的区别

Exception和Error都继承了Throwable类,在Java中只有Throwable类的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机子的基本组成类型Exception和Error提现了Java平台对于不同未知情况的分类。Exception是程序正常运行中,可以预料到的意外情况,可能并且应该被捕获,进行相应处理。Exception分为两类,可检查(check...

2019-01-03 11:29:11 283

转载 Java泛型深入理解之类型擦除

参考:java核心技术一、Java泛型的实现方法:类型擦除前面已经说了,Java的泛型是伪泛型。为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉。正确理解泛型概念的首要前提是理解类型擦出(type erasure)。Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译...

2018-12-31 23:30:15 193

原创 Java类何时被加载?

java类什么时候加载?,加载类的原理机制是怎么样的?答:很多人都不是很清楚java的class类什么时候加载在运行内存中,其实类加载的时间是发生在一下几种情况:1.实例化对象时,就像spring管理的bean一样,在tomcat启动时就实例化了bean,那么这个对象bean的类就加载了2.通过类名调用静态变量或方法的时候(类名.class除外)。 jvm加载java类的原...

2018-12-12 12:15:00 2083

原创 WindowsAPI实现的读写锁(C++)

使用Windows提供的互斥体和事件体来实现读写锁。CreateMutex,CreateEvent,WaitForSingleObject,WaitForMultipleObjects,ResetEvent,SetEvent,ReleaseMutex,CloseHandle,不熟悉这组API的童鞋可以边看代码边查。 RWLockImpl.h#ifndef _RWLockImpl_Head...

2018-08-30 10:38:58 2337 2

原创 数据库约束总结

主键约束:CREATE TABLE t( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY); 备注:一张表只能有一个。唯一键约束:CREATE TABLE t( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(30) NOT NULL UNIQUE KEY);备注:...

2018-08-13 18:29:50 286

原创 快排的三种优化方式。

对于快排而言,其核心在partition中,主要是对于pivot的选取上,所以我们可以按以下三种方案进行优化:1.在数组长度大于某一个阈值范围时,我们进行递归快排,当数据长度小于阈值时,我们进行插入排序。2.在partition中选取pivot时,选取首尾中的进行比较,选取中位数为pivot,以保证pivot能够尽可能的固定在中间,而让两端递归的子数组更加均衡。3.进行三路partit...

2018-08-09 21:16:20 2516

原创 SIGPIPE信号产生的原因

在TCP连接半关闭状态下,其退化成了单工通信,即一方只能发,一方只能收。此时,如果让只能收的一方去调用write函数发数据,会导致TCP给其回复一个RST段,之后如果再调用write就会产生SIGPIPE信号,对于这个信号的处理我们通常忽略即可。signal(SIGPIPE,SIG_IGN)默认的SIGPIPE信号的处理方式为exit当前进程。...

2018-08-09 11:07:45 842 1

原创 流协议,粘包,产生原因,解决方案

TCP是字节流,无边界的协议。UDP是传的报文,是有边界的。所以TCP会产生粘包问题 具体原因:1.由于程序write进套接字缓冲区时将一段完整的消息分开了,此时会造成粘包。2.由于TCP协议有MSS的限制,可能会产生分段,所以会产生粘包。3.由于IP协议有MTU的限制,可能会进行分片,所以会产生粘包。解决方案:应用层自己维护消息与消息的边界。1.定长包2.包尾加\...

2018-08-08 21:31:46 171

原创 关于服务器进入TIME_WAIT状态,导致无法重启绑定端口的解决方案

我们在bind之前 开启地址重复利用即可解决绑定失败的问题。....setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); //直接调用即可bind(....)....

2018-08-08 19:49:44 2131

原创 对于listen函数第二个参数的理解

之前一直没有彻底搞清楚listen这个第二个参数指定之后到底有什么作用,今天看UNIX网络编程总算是搞明白了。我们从头开始说:监听端口后,被动套接字会等待连接,此时系统维护着两个队列,第一个队列存放的是已建立连接的套接字(即完成三次握手后的),第二个队列存放的是未建立连接的套接字(处在三次握手中的)。每次accept函数会将第一个队列中的套接字返回,进行通信,以完成网络传输。所以liste...

2018-08-08 19:34:17 4666 9

原创 TCP/IP如何保证有效?

1.TCP/IP使用超时重传机制,保证当丢包时能重传该数据包。那如何保证数据包一定到呢,这就引入了确认机制,通过确认保证接收方已经接收到该数据包,并且告诉发送方我想接收的下一个数据包的序号。即为超时重传+确认。2.应用数据被分为TCP认为合适大小的数据块(MSS段),进行段传输。即为合理分段传输。3.由于IP是不可靠传递,所以可能数据段失序,此时通过头部的序号进行重排。即为重新排序。4...

2018-08-07 00:03:10 517

原创 线程池思路

自己的写的看法:有一个Pool类,内部管理任务(job)的分发。维护任务队列和线程队列(忙碌和空闲),并创建一个分发线程(专门用于任务的分发)。这个分发线程会调用分发函数,分发任务队列中的任务。 当添加一个新任务的时候(CThreadManage->Run()方法添加任务),Pool会将这个新任务添加到任务队列中。添加后任务不一定立即执行,而是等待线程池中的分发线程进行分发。 分发线...

2018-08-01 21:57:50 267

原创 C++ 内存对齐 和 Windows系统内存分配对齐

C++中的class、struct、union首地址内存值对齐到第一个数据成员字节大小的整数倍,如第一个是short(2字节)则首地址是2字节的整数倍,class、struct内存大小是对齐到最大字节的整数倍。union的大小以大的成员为准。windows的virtualAlloc()分配的空间首地址是对齐到64kb,空间的size是对齐到4kb。...

2018-04-11 20:20:39 766

原创 死锁

死锁的必要条件互斥:每个资源要么已经分配给了一个进程,要么就是可用的。占有和等待:已经得到了某个资源的进程可以再请求新的资源。不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显示地释放。环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。死锁的处理方法1.鸵鸟策略把头埋在沙子里,假装根本没发生问题。因为解决死锁问题的代价很高,...

2018-03-29 11:05:33 778

原创 进程同步(操作系统层面,不涉及具体系统api)

1.临界区对资源进行锁定的那段代码称为临界区。为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查。//entry section//critical section//exit section2.同步与互斥同步:多个进程按一定顺序执行;互斥:多个进程在同一时刻只有一个进程能进入临界区3.信号量信号量(Semaphore)是一个整型变量,可以对其执行down和up操作。down:如果信号...

2018-03-29 10:40:08 204

原创 调度算法

1.批处理系统中的调度1.1先来先服务调度最先进入就绪队列的作业。有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。1.2短作业优先调度估计运行时间最短的作业。长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。1.3 最短剩余时间优先允许比当前进程剩余时间更...

2018-03-28 17:12:56 293

原创 对于二叉树的非递归遍历(非常好记的三种方式)

显然,我们需要用一个stack来模拟递归时的函数调用。对于三种遍历,我们都使用push当前节点->push左子树->pop左子树->push右子树->pop右子树的方式。但是cout时机会有所不同。对于前序遍历来说,每次访问到一个节点就cout;对于中序遍历来说,每次将右子节点进栈时,把当前节点cout;对于后序遍历来说,每次pop的时候cout。另外我们还需要一个last...

2018-03-27 15:58:17 8342 4

原创 变位词问题求解

变位词问题,假设有a和b两个字符串,判断b是否为a子串的变位词。例如a = "hello" 时b="ell"、"lel" 、"le" 返回true,b="elo"返回false假设全是a~b的字母组成解:利用滑动窗口思想。代码如下bool IsChangedWord(char *a,int la,char *b,int lb){ if (a == NULL || b==NULL || la&l..

2018-03-27 14:31:40 217

原创 删除数组中的a和复制数组中的b

一个字符串要删除数组中的a,可以使用前向赋值。int i=newlen-1,j=len-1;for(;j>=0;j--){ if(arr[j] != 'a') arr[i++]=arr[j];}一个字符串要复制数组中的b,可以使用后向赋值(前提是空间足够大,一般题中会注明)int i=newlen-1,j=len-1;for(;j>=0;j--){ arr[...

2018-03-19 14:34:57 335

原创 题:0-1串交换统计

把0-1串(只包含0、1)进行排序,可以交换任意两个位置的数,要求最后串中的0全部在左边,1全部再右边,问最少需要多少次交换?分析:最左边的0和最右边的1都不用管int ans=0,i=0,j=len-1;while(i<j){ while(i<j&&arr[i] == 0) {i++;} while(i<j&&arr...

2018-03-19 14:20:19 387

原创 (原创)单词翻转

1.循环移位例:abcd循环移位一次就是bcda循环移位两次就是cdab循环移位三次就是dabc结论:长度为n,循环移位m次其实就是,移位m%n次。编程思路:前m%n位翻转,后m-m%n位翻转。再总体翻转一次。举一反三:以上为循环左移动,如果是右移动呢?编程思路:前m-m%n位翻转,后m%n位翻转,再总体翻转一次。2.单词翻转例:I'm a student. 翻转之后结果:student. a I...

2018-03-19 13:59:51 351

原创 (面试)关于简单工厂、工厂、抽象工厂模式学习心得

前言所谓简单工厂,工厂,抽象工厂。当我一开始看到并学习这个这三个概念的时候就感觉这三个感念很相似,有点混乱,事实证明,确实让我变得很混乱。即使当初学的时候勉强看懂,但是事后便抛诸脑后,统统忘记到九霄云外了。因此当我回过头从新理解概念时,总结了以下心得,加深理解,并且做一个备忘录。工厂类模式设计的核心是:让“生产”和“产品”解耦。简单工厂所谓的简单工厂,我的理解是不用管是什么产品,我们将所有产品的生...

2018-03-14 21:29:32 3122 1

转载 caffe模型训练好之后如何调用的问题

http://blog.csdn.net/u013698770/article/details/65449882

2018-03-10 22:30:00 1820

原创 动态规划

动态规划动态规划就是消除冗余,直接使用之前算过的值,而不需要再次重新计算的方式。记忆搜索1.记忆搜索是某种形态的动态规划。2.记忆化搜索方法不关心达到目的的路径。3.动态规划是规定好每一个递归过程的计算顺序,以此计算,后面的计算依赖前面的计算4.两者都是空间换时间,也都有枚举过程,区别在于动态规划有计算顺序(可以进一步优化),而记忆搜索不用规定。例子:给定数组arr,arr中所有的值都为正数且不重...

2018-03-09 21:39:23 157

原创 内存管理策略!(13)

进程的虚拟地址对于32位进程而言,这个地址空间的大小为4GB。而64位进程则可以到达16EB的地址空间。每个进程都有自己专有的地址空间,当进程中的个线程运行时,他们只能访问属于该进程的内存

2017-10-10 21:02:03 212

原创 线程调度、优先级和关联性(7)

线程的挂起和恢复 线程内核中各有一个值表示线程的挂起计数。调用CreateProcess或者CreateThread时,系统将创建线程内核对象,并把挂起计数初始化为1。这样便不会给这个线程调度CPU了。 在线程初始化后,CreateProcess或者CreateThread函数将查看是否有CREATE_SUSPENDED标志传入。如果有,则函数返回,新线程立刻挂起。如果没有,函数会将线程的

2017-09-26 23:04:12 643

转载 python对象编程总结(一)

对于一个python的class而言,拥有类属性,类对象,实例对象,实例属性等概念。class A: name="A" #类属性,为类所共有,有点类似c++中的静态数据成员 def printName(self): #定义了一个方法 print(self.name) 类支持两种做法:1.引用,即直接使用类对象和类属性。2.实例化,即产生一个对象的实例。比如:

2017-09-26 09:32:14 240

原创 python对象编程总结(一)

对于一个python的class而言,拥有类属性,类对象,实例对象,实例属性等概念。class A: name="A" #类属性,为类所共有,有点类似c++中的静态数据成员 def printName(self): #定义了一个方法 print(self.name)      类支持两种做法:1.引用,即直接使用类对象和类属性。2.实例化,即产生一个对象的实例。比如:

2017-09-24 15:20:28 432

原创 caffe第一步,配置VS2015环境。

相信很多人都使用caffe,caffe确实是一个非常方便的框架,并且可以帮助大家很快的掌握深度学习框架,但是它的环境配置实在是痛苦万分,现在给大家总结一下配置过程,希望不用走弯路。      首先应该先做前期的准备工作,对此caffe官网的答案是:可以根据以上需要下载准备软件,CMake,VS2015,CUDA,cuDNN等。1.下载Anaconda,以后直接conda安装python

2017-09-20 15:57:29 407

原创 揭秘!为何要用_beginthreadex,而不用CreateThread和_beginthread

由于历史原因,所以C/C++运行库并不是为多线程应用程序而设计的,所以为了保证其中的某些变量和函数的安全,那么必须创建一个数据结构,并使之与使用了C/C++运行库函数的每个线程所关联。当在调用C/C++运行库函数时,那些函数必须读取主调自己的线程的数据块,从而避免印象其他线程。 所以当编写C/C++代码时,请调用_beginthreadex,而不要使用CreateThre...

2017-09-19 14:07:30 4074 1

原创 创建线程的内幕(6)

当调用CreateThread函数后,线程内核对象的使用计数初始化为2,暂停计数被初始化为1,退出代码被设为STILL_ACTIVE(0x103),并且对象被设为未触发状态。      一旦创建线程内核对象,系统便分配内存,供线程堆栈使用。此内存是从进程地址空间内分配的,线程没有自己的地址空间。然后系统将CreateThread函数传入的pvParam参数值放入堆栈最上端,紧接着它下方是pfn

2017-09-19 13:06:15 498

空空如也

空空如也

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

TA关注的人

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