自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

奔波儿灞

勤学如春起之苗,不见其长,日有所增。辍学如磨刀之石,不见其损,日有所亏。

  • 博客(52)
  • 收藏
  • 关注

原创 ThrealLocal使用场景

每个线程需要独享的对象,且这个对象是线程不安全的,所以需要ThreadLocal给每个线程复制一份 eg:Random、SimpleDateFormat 都是线程不安全的;以下代码是通过线程池来打印各个线程的时间` public static ExecutorService executorService = Executors.newFixedThreadPool(10); publ...

2020-01-16 11:59:04 411

转载 X86-64寄存器和栈帧

概要说到x86-64,总不免要说说AMD的牛逼,x86-64是x86系列中集大成者,继承了向后兼容的优良传统,最早由AMD公司提出,代号AMD64;正是由于能向后兼容,AMD公司打了一场漂亮翻身战。导致Intel不得不转而生产兼容AMD64的CPU。这是IT行业以弱胜强的经典战役。不过,大家为了名称延续性,更习惯称这种系统结构为x86-64X86-64在向后兼容的同时,更主要的是注入了全新的特...

2018-10-16 18:48:36 251

原创 AQS--独占锁源码解析

AQS独占锁是很多并发包的基础,像读写锁,CountDownLatch都是基于AQS实现的,搞懂其原理对我们学习java并发包会有很好的作用。- 先来看锁的几种状态 volatile int waitStatus; //锁状态 //以下几种状态代表锁的具体值 static final Node EXCLUSIVE = null;//代表独占锁模式 ...

2018-09-20 11:25:12 451

原创 并发测试辅助类CountDownLatch使用与源码

CountDownLatch类介绍:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重...

2018-09-19 10:21:46 185

原创 算法基础之--hash表新增,删除,扩容

package wck.sort;import java.util.TreeMap;/** * 二次封装hashtable。基于数组和TreeMap * @param <K> * @param <V> * */public class HashTable<K, V> { private static final int u...

2018-09-13 19:11:17 482

原创 算法基础之--红黑树实现

package wck.sort;/** * Created on 18/9/13. *//** * @program: demo * @description: 红黑树实现 * @author: wck * @create: 2018-09-13 11:07 **/public class RBT <K extends Comparable<K>, V&gt...

2018-09-13 14:46:00 155

原创 算法基础之--快速排序实现

package wck.sort;/** * Created by wusong on 18/9/12. *//** * @program: demo * @description: 快速排序 * @author: wck * @create: 2018-09-12 10:51 **/public class QuickSort { // 递归使用快速排序,对arr[...

2018-09-12 14:22:53 177

原创 算法基础之--归并排序

package wck.sort;/** * Created on 18/9/11. */import java.util.Arrays;/** * @program: demo * @description: 归并排序 * @author: wck * @create: 2018-09-11 16:11 **/public class MergeSort { ...

2018-09-12 10:40:08 121

原创 算法基础之--二分搜索树(添加,删除,深度优先遍历,广度优先遍历)

sssss

2018-09-10 16:27:21 189 1

原创 算法基础之--二分查找实现

package wck.sort;/** * Created on 18/9/10. *//** * @program: demo * @description: 二分查找实现 * @author: wck * @create: 2018-09-10 11:11 **/public class BSearch { /** * 非递归实现 * @pa...

2018-09-10 12:00:00 124

原创 算法基础之--最大堆实现

上图红色代表树节点索引;左子节点和父节点的索引关系是 : 2*n 右子节点和父节点的索引关系是 : 2*n +1package demo;/** * * @author Administrator * 最大树---------------------------------------- */public class MaxHeap { //定义这个堆最大能存...

2018-09-09 17:34:43 234 1

原创 算法基础之--插入排序

package wck.sort;/** * Created on 18/9/7. *//** * @program: demo * @description: 插入排序 * @author: wck * @create: 2018-09-07 17:10 **/public class InsertSort { //插入排序 final static int...

2018-09-07 19:12:57 131

原创 设计模式中的几种关系总结

面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖、关联、聚合、组合、继承、实现。他们的耦合度依次增强。 可以参考下图的关系对应: 1.依赖(Dependence)描述:可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。表现在代码层面,类A当中使用了类B,其中类B是作为类A的方法参数、方法中的局部...

2018-09-04 17:23:58 728

原创 AQS同步队列之共享锁源码解析

AbstractQueuedSynchronizer(以下简称AQS)作为java.util.concurrent包的基础,它提供了一套完整的同步编程框架,开发人员只需要实现其中几个简单的方法就能自由的使用诸如独占,共享,条件队列等多种同步模式。我们常用的比如ReentrantLock等基础类库都是基于AQS实现的,我们开发人员更应该了解它的实现原理,这样才能在使用过程中得心应手。 //...

2018-08-31 20:02:06 290

原创 Java集合之 Map源码解析

HashMap: 也是我们平时开发中使用频率很高的双列集合,直接父类是AbstractMap,是基于hash表存储的一种集合。 几个重要的类变量: //hash表的初始化大小,默认为16.是基于数组实现的。 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 ...

2018-06-04 17:14:03 295

原创 JVM如何优化

一、JVM内存模型及垃圾收集算法1.根据Java虚拟机规范,JVM将内存划分为:New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,有虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。年轻代(N...

2018-05-21 13:39:50 13478 8

原创 java集合整理 Set源码解析

Set存储基本数据类型: 由以下代码我们可以看到Set是存取基本数据类型无序,但是如果基于java8的strean流来说却是有序的。普通的增强for循环打印的结果却是无序的,但是可以保证的是都不可以存储相同的元素。 public static void main(String[] args) throws InterruptedException { HashSet ...

2018-05-20 04:25:26 862

原创 java集合整理 List源码解析

数组:/** * 数组大小固定,存储有序(存和取顺序一直) * 直接打印输出对象需要重写toString()方法,否则会调用父类的toString()打印的是引用地址值 */ Student[] students = new Student[5]; students[0] = new Student("张三"...

2018-05-19 18:37:27 685

原创 lucene搭建及应用。

去官网下载Lucene随意一个版本,百度很多下载教程: 我这里下载的是最新的版本 下面是几个较为核心的包:lucene-analyzers-common-7.2.1.jarlucene-core-7.2.1.jarlucene-facet-7.2.1.jarlucene-highlighter-7.2.1.jarlucene-memory-7.2.1.jarlucene-q...

2018-04-08 17:00:20 538

原创 hibernate中的HQL到底用没用一级缓存?

一般正常来说,我们认为发送两次相同的查询,hibernate中是只会打印一次sql(也就是访问数据库),第二次再进行查询时,会从一级缓存中拿。 那HQL也用了一级缓存么?俺们来验证下://Hql查询,查询结果会放入Session一级缓存中.但是每次调用Hql查询都会生成Sql语句?// 并不代表 Hql没有使用1级缓存. public class Demo2 { @Te...

2018-03-07 11:20:47 720

原创 hibernate save和persist方法的区别

save:save方法如果在保存对象之前设置了id,那么该id也会被认为是无效的。persist:体现的是持久化,persist体现的是持久化理念,也包括id.如果在保存之前设置了id,但主键策略由数据库维护,造成冲突,会报出异常。...

2018-03-07 11:04:48 439

原创 事物

事务的特性 原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。 隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。 持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性...

2018-03-06 14:36:53 171

原创 Java集合整理(List and Set and Map)

集合的由来 数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少 数组和集合的区别 区别1 : 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值集合只能存储引用数据类型(对象)集合中也可以存储基本数...

2018-03-06 12:23:32 219

原创 log4j配置略解

# trace(堆栈)< DEBUG < INFO (信息)< WARN < ERROR < FATAL(致命)### set log levels ###log4j.rootLogger=debug, stdout //debug输出级别,使用stdout输出器,(还有可以用文件输出器)### \u628A\u65E5\u5FD7\u4FE1\u6...

2018-03-05 17:15:40 153

原创 XShell隧道通过跳板机连接内网机器

XShell隧道通过跳板机连接内网机器

2018-02-23 16:05:38 10164

原创 HttpSession

HttpSession 它也是一个域对象: session servletContext request 同一个会话下,可以使一个应用的多个资源共享数据 cookie客户端技术,只能存字符串。HttpSession服务器端的技术,它可以存对象。HttpSession request.getSession():内部执行原理 1、获取名称为JSESSIONID的co

2018-01-21 16:52:18 167

原创 Java 中URL 类的使用

最近写第三方短信验证时使用了Java中的URL类,简单的几行代码就可以高效完成。 代码如下String contentUrlEncode = URLEncoder.encode(content,encode); buffer.append("http://ceshi/api/sendto/mm.php?username="+username+"&password_

2018-01-11 18:01:18 633

原创 方法调用

方法调用过程是指确定被调用方法的版本(即调用哪一个方法),并不包括方法执行过程。我们知道,Class 文件的编译过程中并不包括传统编译中的连接步骤,一切方法调用在 Class 文件调用里面存储的都只是符号引用,而不是方法在实际运行时的内存布局入口地址,也就是说符号引用解析成直接引用的过程。这个特性使得Java 具有强大的动态扩展能力,但也使得 Java方法调用过程变得复杂起来,需要在类加载器件,甚

2018-01-10 22:42:44 224

原创 单分派,多分派

方法的接收者和方法的参数统称为方法的宗量。 根据分派基于宗量多少(接收者是一个宗量,参数是一个宗量),可以将分派分为单分派和多分派。单分派是指根据一个宗量就可以知道调用目标(即应该调用哪个方法),多分派需要根据多个宗量才能确定调用目标。如下代码:package diptch;public class DynamicDispatch { static class QQ {}

2018-01-10 19:46:14 575

原创 动态分派

与静态分派不同滴是,动态分派Java虚拟机是根据实际类型来分派方法执行版本。典型例子就是方法的重写。看代码:package diptch;public class DynamicDispatch { /** * * @author Administrator * */ static abstract class Huma

2018-01-10 17:34:26 258

原创 静态分派

Java面向对象的三个基本特征:继承,封装,多态,我们这次来看Java虚拟机如何实现,这里说的不是语法上的实现。 静态分派: 在Java语言中符合“编译期可知,运行期不可变”这个要求的方法,主要包括静态方法和私有方法两大类,前者与类型直接关联,后者在外部不可被访问,这两种方法各自的特点决定了他们不可能通过继承或别的方式重写其他版本,因此他们适合在类加载阶段进行解析。 静态方法、私有方法、实例

2018-01-10 16:55:39 161

原创 策略模式

策略模式(Strategy):定义了算法家族,分别封装起来,他们之间可以相互替换,此算法的变换,不会影响到算法的客户。 上图中Strategy的子类定义了不同的算法,Context聚合Strategy抽象类,Context来维护具体策略的关系,客户端无需知道内部具体操作。具体实现:package strategy;public abstract class Strategy

2018-01-07 18:31:13 137

原创 代理模式

代理模式: 大话设计模式中对代理模式的描述是为其他对象提供一种代理以控制对这个对象的访问。 举个栗子,例如我们有个是实体方法实体方法eat()就是吃饭,但是过了一段时间后我想在吃饭前进行祈祷,我们不得不去修改这个eat()方法,改一次两次还好,单如果之后在吃饭前又有其他的事情,我们就需要不停的去修改它,代码也会贼臃肿,代理模式也就应运而生,我们不修改原来的方法,只是在之前原有的功能上添加

2018-01-06 17:05:34 122

转载 算法基础-插入排序进阶之希尔排序

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。希尔排序是记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。我们分割待排序记录的目的是减少待排序记录的个数,并

2018-01-05 18:00:11 179

原创 算法基础之插入选择排序

插入排序 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所

2018-01-04 15:14:14 177

原创 C语言指针域内存

计算机中:1个字节=8 byte; 32位代表32个地址总线,和操作系统的寻址地址有32个 一个地址代表一个字节; 1024字节=1K;32位最大管理内存4G; 1个字节占用8个二进制位;内存交给操作系统管理; main()函数是入口,操作系统(统一管理内存)通过入口执行代码, 操作系统除了给内存做编号,还做规划,64位。前48位作为用户,程序员调用用,剩余的供操作系统内核使用。 下图

2017-12-26 15:40:17 1914

转载 JVM何时会进行全局GC

1、System.gc()方法的调用此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇性停顿的次数。强烈影响系建议能不使用此方法就别使用,让虚拟机自己去管理它的内存,可通过通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。2、老年代代空间不足老年代空间只有在新生代对象

2017-12-02 17:52:55 783

原创 JVM内存分配与回收策略

在基于Serial/Serial Old收集器(ParNew /Serial Old收集器组合基本也符合)下的的内存回收策略。对象优先分配在Eden区域: 在大多数情况下,新生代的对象在Eden区重分配,当Eden区域没有足够的空间分配时,虚拟机会进行一次Minor GC.V M参数:-verbose:gc -Xms200M -Xmx200M -Xmn100M -XX:+PrintG

2017-12-02 17:38:58 195

原创 JVM垃圾收集器参数总结

参照深入JVM虚拟机

2017-12-01 22:23:38 162

转载 Java 中Class文件详解

转自:JVM中class文件探索与解析一直想成为一名优秀的架构师的我,转眼已经工作快两年了,对于java内核了解甚少,闲来时间,看看JVM,吧自己的一些研究写下来供大家参考,有不对的地方请指正。 废话不多说,一起来看看JVM中类文件是如何加载和运行的。 (1)首先,编写简单代码,对其编译生成的class文件进行研究,其java代码如下: View Code 编译之后,用WinHex软件打开其clas

2017-12-01 17:46:49 770

空空如也

空空如也

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

TA关注的人

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