- 博客(55)
- 资源 (5)
- 收藏
- 关注
原创 TIME_AWAIT 和CLOSE_WAIT.md
### 1. TCP连接建立与断开过程建立:首先,客户端主动进行连接,客户端处于SYN_SENT状态,发送同步码SYN=J,服务器收到SYN后状态为SYN_RCVD;然后,server发送SYN=K , ACK=J+1(对SYN=J进行确认),client接受SYN和ACK建立连接,处于ESDABULISHED状态;client 发送 ACK=K+1(确认K收到),server收到ACK建立连接ES
2017-10-29 18:36:05
961
原创 Consul 微服务注册与发现
1. 创建Spring Boot项目IDE :IntelliJ IDEAFile ->new->project->Spring Initializer 创建Spring Boot项目pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht
2017-10-22 21:25:26
1688
原创 Java 9 新特性之模块化和进程API
Java 9 新特性:https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-C23AFD78-C777-460B-8ACE-58BE5EA681F61. Java Platform Module System 模块化系统模块化系统是Java 9 最大的一个特性,模块之间存在相互的依赖关系,可以导出一个公共的API,并且隐藏实现的细节
2017-09-24 18:45:34
479
原创 事务
1. 概述 事务是由一组SQL语句组成的访问并更新数据库中各种数据项的一个程序执行单元。1.1 事务的特性(ACID)原子性(A):一个事务是一个不可分割的工作单位, 事务中任何一条SQL语句执行失败,整个事务将失败,执行成功的SQL语句将进行回滚。一致性(C):事务将数据库从一种状态转变为另一种一致的状态,事务开始前和结束后数据库的完整性约束没有被破坏。隔离性(I):事务的隔离性要求每个事务
2017-09-17 18:13:53
426
原创 MySQL InnoDB存储引擎中的锁(二)
1. 锁的算法InnoDB存储引擎中有三种行锁算法:Record Lock:单个行记录上的锁Gap Lock: 间隙锁,锁定一个范围,但不包含记录本身Next-key Lock: Gap Lock + Record Lock, 锁定一个范围, 并且锁定记录本身1.1 Next-Key LockNext_Key Lock 是结合了Gap Lock 和 Record Lock的一种锁定算法,例如
2017-09-17 18:04:36
414
原创 MySQL InnoDB索引
1. InnoDB索引概述InnoDB可支持如下几种索引:B+树索引:由平衡二叉树演化而来,给定键值不能找到具体的行,只是找到数据行所在的页,然后将该页读入内存,再在内存中进行查找想要的数据.全文索引哈希索引:InnoDB支持的哈希索引是自适应的,会根据表的使用情况自动为表生成哈希索引,不能人为干预一张表的是否生成哈希索引.2. B+树索引B+树索引的一个特点是“高扇出性”(可理解为每个节点
2017-09-10 18:20:50
440
原创 MySQL InnoDB存储引擎中的锁
数据库锁(Lock)针对的对象是事务,用于锁定数据库中的表、页、行。一般lock的对象只有在事务commit或者rollback之后才会释放.1. 锁类型(InnoDB实现了两种行级锁)1.1行级锁共享锁 (S Lock):允许事务读一行数据排他锁(X Lock):允许事务删除或者更新一行数据1.2锁的兼容若事务T1获得了行r的共享锁,则事务T2可以立即获得行r的共享锁,该情况称为锁兼容.若事务
2017-09-02 17:49:10
363
原创 首次安装配置hadoop2.6.5碰到的坑
1.安装编译hadoop时:hadoop2.6.5 依赖protoc2.5.02.hadoop2.6.5的配置文件在/etc/hadoop目录下3.需要将/etc/hadoop/yarn-evn.sh中 修改“JAVA_HOME=你的jdk目录”4.修改配置文件路径:/etc/hadoop/hadoop-evn.sh中export HADOOP_CONF_DIR=/opt/hadoop
2017-06-09 17:08:08
1490
转载 Synchronized 锁优化
文章转自:http://blog.youkuaiyun.com/u010723709/article/details/503416311 对象头与锁要了解Synchronized的锁,必须知道对象头是怎么回事。因此这个锁就保存在对象头中。Hotpot虚拟机的对象头分两部分信息,第一部分用于存储对象自身的运行时数据,如HashCode,GC分代年龄等,这部分数据长度在32位和64位虚拟机中分别为32bi
2017-03-28 19:40:17
562
原创 Java ThreadPoolExecutor 简单剖析
一、ThreadPoolExecutor概述1.简介ThreadPoolExecutor继承自AbstractExecutorService。线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行集合任务时使用的线程)的方法。每个 ThreadPoolExecutor 还维护着一些基本的统计数据,如完成的任务数
2017-03-22 15:52:43
364
原创 JVM指令重排导致Singleton双重锁定出错
指令重排导致单例模式失效我们都知道一个经典的懒加载方式的单例模式:public class Singleton {private static Singleton instance = null;private Singleton() { }public static Singleton getInstance() {if(instance == n
2017-03-16 15:56:38
1836
原创 java.util.concurrent.locks.ReentrantLock 源码剖析
ReentrantLock从jdk1.5开始引入,相对于synchronized关键字有较好的效率。方法摘要如下:方法摘要 intgetHoldCount() 查询当前线程保持此锁的次数。protected ThreadgetOwner() 返回目前拥有此锁的线程,如果此锁不被任何线程拥有,则返回
2017-02-28 22:32:53
458
原创 Redis跳跃表实现
Redis在 redis.h中定义了跳跃表的节点和跳跃表的结构如下:typedef struct zskiplistNode { robj *obj; double score; struct zskiplistNode *backward; struct zskiplistLevel { struct zskiplistNode *forward;
2017-01-07 20:29:49
674
原创 Redis基本命令
结构类型操作stringget:获取指定键对应的值,set:设置指定键的值,del:删除指定键对应的值(适用于所有元素)listrpush:插入链表右端lrange:获取给定范围的所有值(-1:最后一个)lindex:获取指定位置的单个元素lpop:从最左边弹出一个值,并返回该值sets
2016-12-03 21:19:23
387
原创 Java多线程之 生产者与消费者
JDK的Concurrent包中的BlockingQueue接口,增加了可阻塞的插入和获取等操作。当队列为空时,获取操作被阻塞;当队列满时,插入操作被阻塞。通过BlockingQueue可以和方便的实现生产者与消费者模式。LinkedBlockingQueue(一个BlockingQueue的实现类)通过分别在插入和获取操作上加不同的Reentrant锁,来实现插入操作的同步和获取操作的同步,
2016-11-26 10:45:45
389
转载 Java并发编程(一) Java内存模型
物理计算机并发问题在介绍Java内存模型之前,先简单了解下物理计算机中的并发问题。由于处理器的与存储设置的运算速度有几个数量级的差距,所以现代计算机加入一层读写速度尽可能接近处理器的高速缓存来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存中,这样处理器就无须等待缓慢的内存读写了。基于高速缓存的存储交互引入一个新的问题
2016-09-27 16:12:57
300
转载 Java并发编程之Java内存模型
物理计算机并发问题在介绍Java内存模型之前,先简单了解下物理计算机中的并发问题。由于处理器的与存储设置的运算速度有几个数量级的差距,所以现代计算机加入一层读写速度尽可能接近处理器的高速缓存来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存中,这样处理器就无须等待缓慢的内存读写了。基于高速缓存的存储交互引入一个新的问题
2016-09-27 16:08:58
338
转载 new T 与new T()的区别
①T *p =new T;②T *p =new T();这两类用法不同点的总结。 1.若T为类类型,且用户定义了构造函数,则两种形式的效果完全相同,都会调用这个定义了的构造函数来初始化内部成员变量,但是如果此构造函数中并未对成员变量初始化,则这个时候内部的成员变量进行默认初始化——值是未定义的。2.若T为类类型,但是用户并没有定义任何构造函数,则我们可以知道
2016-09-20 16:27:15
5933
原创 JVM——体系结构、生命周期简述
1. JVM 体系结构如图所示,JVM包括类装载器子系统、运行时数据区、执行引擎。类装载器子系统根据给定的权限的名来装入类型(类或者接口)。执行引擎负责执行那些包含在被装载类的方法中的指令。运行时数据区包含方法区、堆、Java栈、PC寄存器、本地方法栈。类装载器子系统:在JVM中负责查找并装载类型的那部分被称为类装载器子系统。JVM中有两种类装载器:启动类装载器和用户自定义
2016-08-24 20:38:10
1667
转载 红黑树
文章转自:http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html红黑树(RBT)的定义:它或者是一颗空树,或者是具有一下性质的二叉查找树:1.节点非红即黑。2.根节点是黑色。3.所有NULL结点称为叶子节点,且认为颜色为黑。4.所有红节点的子节点都为黑色。5.从任一节点到其叶子节
2016-08-23 19:55:54
355
原创 结合Java反射用简单工厂模式改进抽象工厂模式
前一篇简单介绍了抽象工厂模式,结合Java的反射机制,可以用简单工厂模式来改进抽象工厂模式,减少类的数量,增加可维护性。UML图如下:去除IFactory、SqlserverFactory和AccessFactory三个工厂类,取而代之的是DataAccess类,用一个简单工厂模式来实现。代码示例:1. 两个表User和Department的实体类
2016-08-20 12:01:50
2820
1
原创 抽象工厂模式
试想一个应用,在开发时使用的是MySQL数据库,由于各种原因现在需要将底层的数据库更改为Oracle。由于数据库使用的命名空间不同,用到的方法不同,所以很难直接进行替换,往往需要大量的时间进行代码的修改。因此,考虑将DAO层的设计尽可能的降低耦合,一个数据库有多个表,对每个表的操作分别进行封装,抽象出一个对该表进行操作的接口,然后不同的数据库类型(myslq、oracle...),分别进行实现。结
2016-08-20 10:43:24
596
转载 B-Tree 、B+树、B*树
大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。1. B-TreeB 树是为了磁盘或其它存储设备而设计的一种多叉平衡查找树。许多数据库系统都一般使用B树或者B树的各种变形结构,如下文即将要介绍的B+树
2016-08-17 20:55:50
12658
原创 观察者模式
观察者模式又称为“发布-订阅模式”。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主题对象在发生状态变化时,负责通知所有观察者对象,使观察者对象能自动更新自己。Subject类一般用一个抽象类或者接口实现。它把所有对观察者对象的引用保存在一个聚集里边,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,并notify所
2016-08-16 19:56:20
532
原创 Java String、StringBuffer和StringBuilder
1. String String 类代表字符串。Java 程序中的所有字符串字面值(如"abc" )都作为此类的实例来实现。字符串是常量;它们的值在创建之后不能改变。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享它们。String 类包括的方法有:检查序列的单个字符;比较字符串;搜索字符串;提取子字符串;创建字符串副本,在该副本中,所有的字符都被转换
2016-07-30 11:47:44
255
原创 常用JAVA集合框架(Collection、List、Set、Map)
1.常用集合框架结构2. List 2.1 ArrayListList 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于Vector 类,除了此类是不同步的。)每个ArrayList 实例都有一个容量。该容量是指用来存储列表元素
2016-07-29 20:17:18
4768
原创 句柄与指针
句柄是一个32位的整数,实际上是一个Windows在内存中维护的一个对象(窗口等)内存物理地址列表的整数索引。因为Windows的内存管理经常会将当前空闲的对象的内存释放掉,当需要时再重新提交到物理内存,所以对象的物理地址是变化的,不允许程序直接通过物理地址来访问对象。程序将想要访问的对象的句柄传递给系统,系统根据句柄检索自己维护对象列表就能知道程序想要访问的对象的及其物理地址了。句柄是一种指
2016-04-20 22:03:23
1000
原创 《More Effective C++》 Item M2:尽量使用C++风格的类型转换
c++有四种类型转换:static_cast、const_cast、dynamic_cast、reinterpret_cast。1.static_cast(expression)static_cast在功能上基本上与C风格的类型转换一样强大,含义也一样。它也有功能上限制。例如,你不能用static_cast象用C风格的类型转换一样把struct转换成int类型或者把double类型转换成指
2016-04-12 10:35:32
441
原创 《More Effective C++》 Item M1:指针与引用的区别
C++中指针与引用的区别主要体现在两点:引用不可以指向空值、引用总是指向初始化时指定的对象。1、因此,当你使用一个变量并让它指向一个对象,但是该对象有时可能也不指向任何对象时,应该把该变量声明为指针;相反如果变量肯定指向一个对象,不允许变量为空,此时应把变量声明为引用。但是,如下情况应该注意: char *pc = 0; // 设置指针为空值 char& rc = *
2016-04-11 16:31:47
479
原创 MPICH2 Windows 多节点并行计算Demo
刚刚接触MPICH,入手写了一个计算A * B(A 矩阵,B 向量)的测试程序,以熟悉MPICH。程序以主从模式进行设计,主节点负责分发计算任务到不同的计算节点,然后接收从计算节点发送来的计算结果。应用OpenThread线程库,在主机端创建数据接收子线程,专门负责接收计算结果。程序代码如下:数据接收子线程:#pragma once#include #include "Open
2016-03-10 15:39:23
1447
原创 MPICH Demo测试__两主机进行通信出现的问题及解决方案
最近利用VM虚拟机搭建MPICH2 + windows的并行环境,开始入门MPI 编程。运行MPI自带的CPI.exe没有问题,根据教程写了一个两主机进行数据发送和接受的Demo时运行出错,代码如下:#include "mpi.h"#include #include #include #pragma comment (lib, "mpi.lib") void main(int arg
2016-03-07 15:39:56
478
转载 BSP树
原理: 首先,将整个场景包围在一个AABB(外包盒)中,然后以递归形式将此外包盒分为若干比较小的盒子。通常是选取盒子的一个轴,生成与之垂直的平面,将其分为两个小盒子。一般是将盒子分为完全相同的两个部分。与分割平面相交的物体,或存储在此层次上,成为两个子集中的一员;或被这个平面分割成两个不同的物体。重复这个平面分割过程,就可以对每个AABB进行递归细分,直到满足某个标准。通常这个标准是
2015-12-09 17:41:33
981
原创 三线性插值计算重采样点数值
三线性插值是一种较为经典的计算重采样点数值的方法,它将距离重采样点最近8个顶点的权重Wi(i=0,1,2…7)分别计算出来,在进行相加后得到重采样点值。如图所示:假设立方体8个顶点上的数值分别为Pi(i=0,1,2…7),三个坐标轴方向X,Y,Z,顶点与顶点间的距离为1,则每个采样点Pi权重可由如下算式分别得出: W0 = (1 - x)(1 - y)(1 - z) W1 = x(1 - y
2015-12-07 16:46:55
4227
原创 OSG更新回调(UpdateCallback)与事件回调(EventCallback)的相似之处和不同之处
相似之处:(1)由专门的访问器对象 _updateVisitor负责场景图形的更新遍历(2)所有的节点和Drawable几何体对象都可以调用setUpdateCallback设置回调(3)通过实现NodeCallback::operator()或者DrawableCallback::update()函数在相应的对象中添加自定的回调操作不同之处:(1)每个用户交互或者系统
2015-12-03 11:37:49
4655
原创 CUDA二维网格模型下线程索引的计算
用于线程索引计算的CUDA运行时库提供的变量gridDim.x —— 线程网格X维度上线程块的数量gridDim.y —— 线程网格Y维度上线程块的数量blockDim.x —— 一个线程块X维度上的线程数量blockDim.y —— 一个线程块Y维度上的线程数量threadIdx.x —— 线程块X维度上的线程索引threadIdx.y ——
2015-11-23 16:58:11
4188
转载 CUDA线程模型
线程格:由 gridDim.x 个线程块组成 线程块:由 blockDim.x 个线程组成 下面线程格就是由 4 个线程块组成,其中每个线程块有4 个线程。 定位某个线程的方法:threadIdx.x 表示该线程于所在线程块的索引blockIdx.x 表示线程块于线程格的索引 根据 blockIdx.x 找到线程块,再根据 threadI
2015-11-21 10:00:24
794
原创 OSG updateTraversal(更新遍历)
OSG 的更新遍历函数updateTraversal 在系统每帧的执行过程中有着重要的地位,除了处理用户的更新回调对象之外,还要负责更新摄像机的位置,并且更新分页数据库DatabasePager 和图像库ImagePager 的内容。这里我们首先对它的流程做一个概述:1、获取函数的起始时刻。2、使用预设的更新访问器_updateVisitor,访问场景图形的根节点并遍历其子节点,实
2015-08-07 14:53:58
2400
原创 OSG更新遍历(updateTraversal)流程
OSG 的更新遍历函数updateTraversal 在系统每帧的执行过程中有着重要的地位,除了处理用户的更新回调对象之外,还要负责更新摄像机的位置,并且更新分页数据库DatabasePager 和图像库ImagePager 的内容。这里我们首先对它的流程做一个概述:1、获取函数的起始时刻。2、使用预设的更新访问器_updateVisitor,访问场景图形的根节点并遍历其子节点,实
2015-08-03 11:13:36
1468
原创 OSG 视景器、漫游器、摄像机与场景的关系
视景器包括几个最主要的组件:漫游器_cameraManipulator,用于实现交互式的场景漫游;事件处理器组_eventHandlers,负责处理视景器的事件队列_eventQueue,主要是键盘/鼠标等事件的处理;场景_scene,它包括视景器所对应的场景图形根节点,以及用于提高节点和图像数据处理速度的两个分页数据库;摄像机_camera 和_slaves,前者为场景的主摄像机
2015-08-02 16:01:45
3645
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人