- 博客(40)
- 收藏
- 关注
原创 Java IO:网络IO模型
网络IO模型有5种,分别为:阻塞式IO,非阻塞式IO,IO复用,信号驱动式IO 和 异步IO。一. 操作系统如何处理IO Linux 会把所有的外部设备都看成一个文件来操作,对外部设备的操作可以看成是对文件的操作。我们对一个文件的读写,都会通过内核提供的系统调用,内核会给我们返回一个 File Descriptor,这个描述符是一个数字,指向内核的一个结构体,我们应用程序对
2016-02-18 17:25:13 1257
原创 希望能结识更多热爱Java的小伙伴
本博客会比较快的更新,把自己的知识体系梳理出来。希望能包含:Java (多线程,IO,集合,JVM ,小知识点等)前端相关(NodeJs,ReactiveJs )ORM(hibernate,redis,mysql,jpa)后端相关(Spring,SpringBoot)运维相关(nginx,kong,docker,jenkins )基础知识(数据结构(栈,队列,数组,
2015-12-30 16:36:03 684
原创 Java 集合:Collection,List,ArrayList,Vector,LinkedList(实现方式,对比)
Collection ListCollection 是 Java 集合的一个根接口,JDK 没有它的实现类。 内部仅仅做 add(),remove(),contains(),size() 等方法的声明。List 接口是Collection 接口的一个子类,在Collection 基础上扩充了方法。同时可以对每个元素插入的位置进行精确的控制,它的主要实现类有 ArrayList,Vector,Link
2016-03-17 11:40:02 921
原创 Java 多线程:Lock 关键字
sleep() & interrupt()线程A正在使用sleep()暂停着: Thread.sleep(100000); 如果要取消他的等待状态,可以在正在执行的线程里(比如这里是B)调用 a.interrupt();令线程A放弃睡眠操作,这里a是线程A对应到的Thread实例执行interrupt()时,并不需要获取Thread实例的锁定.任何线程在任何时刻,都可以调用其他线程interrupt
2016-03-14 21:53:27 1222
原创 Java 多线程:分析线程池的实现原理
前言我们都知道,所谓线程池,那么就是相当于有一个池子,线程就放在这个池子中进行重复利用,能够减去了线程的创建和销毁所带来的代价。但是这样并不能很好的解释线程池的原理,下面从代码的角度分析一下线程池的实现。线程池的相关类在 Java 中,有几个接口,类 值得我们关注:ExecutorExecutorServiceAbstractExecutorServiceThreadPoolExecutor
2016-03-05 19:27:05 1014
原创 Java 多线程:生产者消费者模型
概念生产者消费者问题描述了两个线程(即生产者线程和消费者线程),共享固定大小的缓冲区,在实际运行中可能出现的问题。 - 生成者:生成一定量的数据放到缓冲区中,然后重复此过程。 - 消费者:在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。要解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数
2016-03-03 12:15:33 740
原创 Java 多线程:synchronized 多线程同步关键字
前言在 多线程生成的原因(Java内存模型与i++操作解析) 中,介绍了Java的内存模型,从而可能导致的多线程问题。synchronized就是避免这个问题的解决方法之一。除了 synchronized 的方式,还有 lock,condition,volatile,threadlocal,atomicInteger,cas等方式。synchronized 用法它的修饰对象有几种: 1. 修饰一个
2016-03-02 11:11:39 1029
原创 做 LeetCode 有感
今天周六,公司一个人也没有,下午花了5个半小时,安安静静的再看,再做了4道 LeetCode 的题目。看完之后,现在仔细回想,获得了什么,好像什么也没有。但是,就是觉得这个过程是很舒服的,就像看了一场电影,和女朋友逛了一次街,去吃了一次火锅一样。做这些题目的时候是有一些想法,但是具体到编码,倒不是想象的那么轻松,1分钟的想法,可能要花一个小时的实现。另外,在看 Discuss 别人的实现中,你会发现
2016-02-27 17:55:46 2759
原创 设计模式:观察者模式(有利于代码解耦)
概念首先,什么是观察者模式:多个观察者去监听主题,当主题发生变化的时候,主题会通知所有的观察者。 盗用网上的一个图:从上图的结构可以看出,主题维护了一个观察者类型的链表,每当主题变化的时候,就会循环调用各个观察者的对应方法(这就是通知)。 在观察者模式中,又分为 推模型 和 拉模型。推模型:主题向观察者推送详细信息。拉模型:主题把自身作为一个参数发送给观察者,观察者需要什么信息,那么就 主题
2016-02-26 09:43:31 1047
原创 设计模式:策略模式(对象的某个行为,在不同的场景中,有不同的实现算法)
前言工作遇到的需求在工作中,遇到这样的需求:需要对一些操作进行记账,比如说,客户购买了一笔资产A之后,那么客户的钱少了客户的资产多了商家的钱多了商家的资产少了等等其实还有一些利息方面的变动,有 M 种变动,总之比较多。而且这个只是考虑客户购买资产A,那么客户购买资产B ,资产C,这个变动还不一样,假设有 N 种 购买方式,那么就是 M * N 的可能变动。思考的问题如何重用客户的购买行
2016-02-26 00:35:00 2650 1
原创 设计模式:装饰器模式(为对象动态的添加功能)
前言在学习 Java IO 的时候,记得头几回看到下面的代码,总是有点纳闷: InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath)); 这个代码,首先创建一个 FileInputStream 的对象,然后再传入到 BufferedInputStream 中,这是要干什么,为什么要这么做。现在
2016-02-25 17:45:10 3319
原创 设计模式:Builder模式(多个构造器参数时可显著改善可读性)
前言看到《Effective Java》第2条:遇到多个构造器参数时要考虑用构建器。马上想起之前自己写的一段代码:return InvestorPurchaseCurrentParamPackage.create( investorSum.getReference_id(), entityCode,
2016-02-24 23:40:39 1546
原创 iTerm 常用命令
标签command + t : 打开新的标签页 command + w : 关闭当前标签页 command + 数字 / command + 左右方向键 : 切换标签页分屏command + d : 水平分屏 command + shift + d : 垂直分屏 command + option + 方向键上下左右:切换标签内的不同区域行内操作ctrl + u : 直接清除本行 ctrl
2016-02-24 18:32:02 1206
原创 网络:contentType,dataType,Accept区别
ContentTypeWhen sending data to the server, use this content type. Default is “application/x-www-form-urlencoded;DataTypeThe type of data that you’re expecting back from the server. If none is spec
2016-02-23 01:42:39 4574
原创 Springmvc:前后端传参方式总结
包括:@PathVarible,@PathParam,@RequestParam,@RequestBody,@RequestHeader 以及 Spring自动封装@PathVarible用法后端@RequestMapping(value="/findarticlesbyclassify/{classifyId}",method=RequestMethod.GET)public String fi
2016-02-23 01:02:18 1821
转载 NodeJs module 的初步理解
一个node js文件就相当于一个模块。在客户端,通过script 标签引入 Js 文件,那么就可以访问其内容。但是这样会带来弊端很多,最大的就是作用域相同,产生冲突问题。nodejs 使用了 exports 对象和 require 对象来解决对外提供接口和引用模块问题。Node 对外提供接口可以把模块中希望被外界访问的内容定义到exports对象中。例如:var name='';function
2016-02-22 19:45:53 2016
原创 Springmvc:基本流程
下图1很好的说明了SpringMVC的流程:图1用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用 HandlerMapping获得该Handler配置的所有相关的对象(包括Handler
2016-02-19 00:37:13 583
原创 Java排序算法:希尔排序
一.思想:是插入排序法的一种改进。先取一个小于n的整数d1作为第一个增量,所有距离为d1倍数的整数作为一个组,然后对组内 进行插入排序,然后再取第二个增量d2二.例子:比如2,5,3,1,4,6.当d=3的时候,所有距离为3的整数作为一个分组,那么2,1作为一个分组,5,4作为一个分组,3,6作为一个分组,然后对分组进行排序。2,1交换为1,2。
2016-02-18 20:35:41 573
原创 Java排序算法:插入排序
一.思想:需访问数列n-1遍,每次处理就是将无序序列的第一个元素与有序序列的元素从后往前逐个进行比较,找到插入的位置,有序序列从该位置起后面的元素依次向后挪动一个位置,新元素则插入该新位置中。二.例子:比如5,4,2,3第一趟排序过程为:把5当做有序序列,无序序列为4,2,3,第一个元素为4,4第二趟排序为:有序序列为4,5无序序列为2,3,第一
2016-02-18 20:07:38 491
原创 Java排序算法:快速排序
一.思想:对冒泡排序算法的一种改进。通过一趟排序将排序的数据分割成两个部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分分别再进行快速排序,依次类推。实现为:开始时先设两个变量i=Start,j=End;以第一个元素作为中间点,pivot=num[i];以j--的形式从后向前搜索,找到第一个比pivot小的,则将num[i] = num[j]以
2016-02-18 19:45:58 472
原创 Java IO:基于字节的IO操作
包括:FileInputStreamByteArrayInputStreamObjectInputStreamBufferedInputStreamDataInputStream上面 5 个为常用的基于字节操作的 IO 操作类,其中前三个 相当于 装饰器模式的 ConcreteComponent,后两个是具体的装饰者类。传送门:装饰器模式一. FileI
2016-02-18 14:47:33 917
原创 Java JVM:编译加载与自定义类加载器
包括:一. 编译机制 二. 类加载机制 三.自定义类加载器一. 编译机制 编译主要是把 .java 文件转换为 .class 文件。其中转换后的 .class 文件就包含了元数据,方法信息等一些信息。比如说元数据就包含了 Java 文件中声明的常量,也就是我们所说的常量池。二. 类加载机制
2016-02-17 16:29:43 1572
原创 Java JVM:垃圾回收问题
包括:一. 垃圾回收基本概念 二. GC日志一. 垃圾回收基本概念 在JVM 中,最需要进行回收的地方就是 JVM 方法区 和 JVM 堆。1.1 可达性分析算法 回收的时候,主要是根据可达性分析算法。如果一个对象不可达,那么就是可以回收的;如果一个对象可达,那么这个对象就不会被回收。那么,对于可达性分析算法,它是通
2016-02-17 15:32:55 906
转载 Java JVM:内存溢出问题
包括:一. 栈溢出(StackOverflowError)二. 堆溢出(OutOfMemoryError:java heap space)三. 永久代溢出(OutOfMemoryError: PermGen space)四. OutOfMemoryError:unable to create native thread Java虚拟机
2016-02-17 15:04:20 1435
原创 Java JVM:内存结构和相关参数
包括:一. Java 整体内存结构二. Java 堆内存结构三. Java 堆内存和非堆内存参数一. Java 整体内存结构以下针对JDK7:图1如图1,JVM内存区域分为PC寄存器,JVM方法栈,本地方法栈,JVM方法区,JVM堆。PC寄存器:存放下一条指令在方法中的偏移量。也可以看做是线程所执行的字节码的行号指示器,字
2016-02-17 14:50:04 1462
原创 Java 集合:Collection 系列(HashSet)
包括一. HashSet 简介二. TreeSet 简介一. HashSet 简介HashSet 继承于 Set 集合,Set 集合 不允许有重复的值,并且最多只有一个空元素,而 Set 集合 又继承于 Collection 集合,所以说 HashSet 也是用于存储当个元素,不是像HashMap 的键值对的形式,但是HashSet 的实现利用了 HashMap,如下
2016-01-19 09:10:51 1147
原创 Java 集合:Map 系列(WeakHashMap概念)
WeakHashMap 是一个实现了 Map 的哈希表,当它的 key 值不再被引用的时候,它的 entry 会自动被释放。所以说,当放入一个键值对的时候,过一段时间,该键值对可能不再存在。WeakHashMap 支持空值和空键。该 WeakHashMap 不是 synchronized 的,当然可以使用 Collectioins 的 synchronizedMap 方法来对 该 Map 进行
2016-01-18 21:22:25 1215
原创 Java 集合:Map 系列(ConcurrentHashMap概念)
ConcurrentHashMap 是 JDK5 中支持高并发,高吞吐量的线程安全HashMap 的实现。它支持完全并发的读和一定程度的并发的写。 ConcurrentHashMap允许多个修改操作并发的进行,关键在于使用了锁分离的技术。它使用了多个锁来控制 hash 表不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每
2016-01-18 21:20:04 602
原创 Java 集合:Map 系列(HashMap,HashTable)
包括:一. Map 介绍二. HashMap 介绍三. HashTable 介绍一. Map Map 是把键映射到值,也就是以一个键值对的形式存储。一个映射不能包含重复的键,一个键只能有一个值。某些映射可以保证其顺序,如TreeMap,某些则不行,如HashMap。二. HashMap 它是基于
2016-01-18 07:53:32 684
转载 Java 多线程:AtomicInteger源码分析——基于CAS的乐观锁实现
AtomicInteger源码分析——基于CAS的乐观锁实现1. 悲观锁与乐观锁 我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时间片之间,需要进行cpu切换,也就是会发生进程的切换。切换涉及到清空寄存器,缓存数据。然后重新加载新的thread所需数据。当一个线程被挂起时,加入到阻塞队列,在一定的
2016-01-17 11:53:28 742
原创 Java 多线程:Condition 多线程同步关键字
包括:一. Condition 概念 和解决的问题二. Condition 在生产者消费者模型中的代码Demo一. Condition 概念 和解决的问题 Condition 是一种更细粒度的并发解决方案。就拿生产者消费者模式来说,当仓库满了的时候,又再执行到 生产者 线程的时候,会把 该 生产者 线程进行阻塞,再唤起一个线程,但是此时
2016-01-17 11:48:05 641
原创 Oauth2 简介
包括:一. OAuth 概念二. OAuth 运行流程三. OAuth 授权模式一. OAuth 概念 OAuth 是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而不需要将用户名和密码提供给第三方应用。OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据
2016-01-08 23:30:01 4973
原创 Docker:Dockerfile语法 以及 一些关键字的区别
一. Dockerfile 语法二. Dockerfile 一些关键字的区别 一. Dockerfile 语法如下为 安装 Kong 的Dockerfile:FROM ubuntuADD jdk-8u51-linux-x64.tar.gz /opt/ADD dsc-cassandra-2.1.11-bin.tar.gz /opt/ADD kong-0.5.4.t
2016-01-08 00:55:05 2936
原创 Docker:常用命令
容器相关:docker ps :列出正在运行的容器docker ps -a : 列出所有的容器docker stop 容器Id : 停止容器的运行docker rm 容器Id:删除容器(需要先停止)docker exec -it 容器Id bash : 进入正在运行的容器内部Ps:删除容器的时候,docker rm 容器Id 的前两三个字符就ok,不需要复制,粘贴容器的id 再删除
2016-01-07 22:43:43 781
原创 数据结构:队列的概念和实现
包括:一. 队列的概念二. 队列的实现三. BlockingQueue一. 队列的概念队列即在表的一端进行插入,在表的另一端进行删除。删除的一端称为队头或者队首,插入的一端称为队尾。插入元素称为进队或者入队,删除元素称为出队。特点:先进先出表。队列的存储结构分为顺序存储结构和链式存储结构。 二. 队列的实现在 Java 中,Queue 作为队列的顶层接口,继
2016-01-06 23:17:41 705
原创 Java 多线程:ThreadLocal 多线程同步关键字
包括:一. 什么是 ThreadLocal二. ThreadLocal 类中的方法简介三. 如何使用ThreadLocal 3.1 3个线程共享一个对象,各自产生序列号 3.2 例子:共享变量a, 使用ThreadLocal 和没有使用的区别四. ThreadLocal 和同步机制的比较五.参考
2016-01-05 07:46:55 1066
原创 持续集成-Docker 与 DaoCloud 的实践(一)
一. 前言二. DaoCloud 持续集成 的 实现三. 总结一. 前言什么是持续集成:http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html。持续集成目前本人接触到的有两套方案。一套是工作中正在使用 Docker + Jenkins 。Jenkins 也是持续集成的主流(Ps
2016-01-04 00:40:59 4147 3
转载 Vim 常用命令
效率至上。一. 光标的移动ctrl + f : 向下翻页。ctrl + b : 向上翻页。n : 向右移动 n 个字符。 (例如 输入20,然后再空格键 光标就会向右移动20个字符 )n:光标向下移动 n 行。gg:移动到第一行G: 移动到 最后一行NG:移动到第 N 行。0 : 移到这一行的首个字符那。二.
2015-12-30 08:48:18 547
原创 Java 多线程:volatile 多线程同步关键字
包括:一. volatile 概念二. volatile 使用需要注意的地方一. volatile 概念volatile 也是 多线程的解决方案之一。volatile 能够保证 可见性,但是不能保证原子性。它只能作用于变量,不能作用于方法。当一个变量被声明为 volatile 的时候,任何 对该变量的读写都会绕过 高速缓存,直接读取主内存的变量的值。如何理解直接读写
2015-12-29 16:27:00 809
原创 Java 多线程:多线程产生的原因
包括:一. Java 内存模型二. i ++ 操作的实质三. Java 多线程产生的原因四. 总结一. Java 内存模型线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM(Java内存模型)的一个抽象概念,并不真实存在。它
2015-12-29 00:49:50 1985
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人