自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(179)
  • 资源 (2)
  • 收藏
  • 关注

原创 深入讲解并发编程模型之概念篇

文章目录并发编程模型的分类Java内存模型的抽象重排序处理器重排序与内存屏障指令happens-before总结所有文章也会同步更新在网站:深夜程猿并发编程模型的分类在并发编程中,我们需要处理两个关键问题线程之间如何通信这里的线程是指并发执行的活动实体。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存、消息传递。在共享内存的并发模型里,线程之...

2019-08-20 01:41:43 326

原创 大白话带你理解网站架构发展历程

阅读更多精彩文章,欢迎关注微信公众号:深夜程猿网站架构发展历程本文讲的网站架构,更多的是网站的部署架构。对于应用服务的架构不会过多涉及,比如SOA、微服务。本文会基于一个虚构的故事,力取使用最简单的语言跟大家讲明白一个网站架构的演进历程。故事的开端小吴是一名程序员,立志要通过自己的努力,使用技术来作出一点值得自己骄傲的事情。突然有一天,小吴需要搬家,但是,家里堆积了许多厚重的书籍,大...

2019-07-27 11:32:23 681

原创 Mybatis底层原理学习(二):从源码角度分析一次查询操作过程

在阅读这篇文章之前,建议先阅读一下我之前写的两篇文章,对理解这篇文章很有帮助,特别是Mybatis新手:写给mybatis小白的入门指南mybatis底层原理学习(一):SqlSessionFactory和SqlSession的创建过程如果你想获得更好的阅读体验,可以点击这里:Mybatis底层原理学习(二):从源码角度分析一次查询操作过程 (1)在使用Mybatis操作数据库...

2018-03-02 19:15:35 2724 1

原创 mybatis底层原理学习(一):SqlSessionFactory和SqlSession的创建过程

上篇文章和大家简单入门了mybatis的增删改查操作:写给mybatis小白的入门指南。这篇文章就从源码角度分析一下mybatis的SqlSessionFactory的创建过程SqlSessionFactory是SqlSession的创建工厂,每一个SqlSession实例代表应用程序和数据库的一次连接。 在整个应用当中,我们应该只创建一个SqlSessionFactory实例,但是...

2018-02-28 22:45:57 1000

原创 centos下面安装node的踩坑之旅

绪论在阿里云买了一个服务器,centos7.0系统。最近需要搭建一下WebRTC服务器,在安装node的时候就遇到了一些坑,这篇文章就记录一下自己踩过的坑以及解决方法,以便以后碰到类似问题回来查阅。安装步骤root用户安装openssl-devel切换到root用户,安装openssl-devel angular2html su - yum install openssl-devel 检查是

2018-01-03 16:39:15 399

原创 springboot模板引擎thymeleaf对于没有关闭标签的错误解析

在使用springboot结合thymeleaf的时候,我们需要做出以下配置正确解析html: 添加pom.xml的依赖: <dependency> <groupId>net.sourceforge.nekohtml</groupId> <artifactId>nekohtml</artifactId> <ver

2017-12-14 22:46:57 1218

原创 记一次才过的坑:label嵌套input

一次这样写页面:<label><input type='number'><input type='number'></label>于是,发现点击第二个input的时候会在safari浏览器回到第一个input,但是谷歌浏览器就没有问题。作为一名前端小白,是在想不明白其中缘由,只知道修改成下面就可以了<label for='c'><input class='c' type='number'>

2017-12-11 15:53:25 4454 1

原创 插入排序(Java实现)

package unit_2;/** * 插入排序算法采用增量模式,每次把第j个数插入有序的A[0...j-1]中 生成另外一个有序的数组。 * 最佳情况复杂度:O(n) * 最坏情况复杂度:O(n^2) * @author WuNanliang * */public class InsertSorted { public static void main(String[] ar

2017-08-02 23:32:42 237

转载 (转)Redis详解(二)---数据类型

http://blog.csdn.net/guchuanyun111/article/details/52067531Redis常用数据类型详解1,redis最为常用的数据类型主要有以下:String Hash List Set Sorted set pub/sub Transactions 在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中是如何描述这些不同

2017-08-02 10:04:50 242

转载 (转)Redis详解(一)

http://blog.csdn.net/guchuanyun111/article/details/52057407(1)什么是redis?Redis 是一个基于内存的高性能key-value数据库。 (有空再补充,有理解错误或不足欢迎指正)(2)Reids的特点redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作

2017-08-02 09:49:18 900

原创 MongoDB学习笔记之文档的CRUD

添加文档: db.集合名.insert(文档名)举例://创建文档java = { "company" : "sun", "usage" : "web", "date" : new Date()}//添加文档 ARTICLE(集合名),java(文档名)db.ARTICLE.insert(java)批量添加文档可以使用db.集合名.insertMany([{},…])

2017-07-30 22:56:16 275

转载 MongoDB学习笔记之环境搭建篇

在开始搭建MongoDB环境的时候,博主是直接百度的,下面是我参照的一篇文章,因此在这里做一个记录。详细步骤读者可以参照这篇文章Mac OX上安装MongoDb博主用的是Mac Air,所以下载安装相对来说比较方便:(一)在命令行输入一下命令 brew install mongodb (二)下载完成,接着输入命令 mongod —config

2017-07-30 15:47:11 304

原创 Java GC杂谈之对象的可达分析与回收算法

接触过Java编程的会知道Java有一个垃圾回收器(GC)的东西。GC是用来回收再内存中不可达的对象,清理出更多内存空间交由程序使用。下面,就来学习了解一下Java GC。本博客涉及到GC的内容如下: ( 参考文章: http://blog.csdn.net/jiangwei0910410003/article/details/40709457 《深入理解Java虚拟机》

2017-07-15 00:50:32 856

原创 SpringMVC的处理模型方式

spring MVC 提供了以下几种途径输出模型数据:ModelAndView:处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据 Map及Model:入参为org.springframework.ui.Model、org.springframework.ui.ModelMap或 java.uti.Map时,处理方法返回时,Map 中的数据会自动添加到模型中。

2017-06-16 21:07:03 417

原创 Mac的bash_profile文件的进入和退出指令

vi ~./bash_profile进入bash_profile文件 i 进入编辑模式 esc退出编辑模式 :(冒号)进入最后行模式 wq保存并退出vi

2017-06-11 23:00:50 14854 1

原创 青蛙跳台阶问题&&斐波那契数列问题

斐波那契数列: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39 斐波那契数列公式: F(n)=F(n-1)+F(n-2)public class Solution { public int Fibonacci(int n) { if (n <= 0) return 0; else if (n

2017-06-10 10:19:11 535

原创 Java线程的生命周期的深入理解

线程的生命周期图 对上图进行对线程的生命周期的分析: (1)新建状态:线程被创建出来,还没有调用start方法; (2)可运行状态:调用线程的start方法,线程等待CPU时间 (3)运行状态:线程获取到CPU时间,开始执行线程任务 (4)阻塞状态:阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice ,暂时停止运行。直到线程进入可运行状态,才有 机会

2017-06-08 10:38:20 873

原创 Android性能优化之避免ANR

相信我们在使用应用的时候,操作频繁偶尔会弹出“应用无响应”的对话框,这就是发生了ANR(Application Not Responding)。那么,什么情况下会触发ANR呢? 通常情况下,当应用无法响应用户输入的时候就会出现ANR对话框。例如,应用在IO操作的时候堵塞UI线程,应用从而无法处理用户输入事件。又或者应用在进行长时间的计算的时候。总而言之,应用在下面两种情况下会发生ANR:

2017-06-04 11:45:05 378

原创 android性能优化最佳实践建议

为了写出更加高效的代码,我们需要遵循两个原则: 一 不要做没有必要做的工作 二 不要分配多余的内存 建议一:不要创建没有必要的对象 建议二:如果不用获取成员变量,建议方法使用静态方法,这样方法就不需要获取对象的状态,方法的调用也会提高15%~20%的速度建议三:建议基本类型常量和String常量使用static final关键字修饰

2017-06-04 11:01:40 685

原创 不可错过的全面详细介绍Android单元测试的系列文章(一)

Android的测试基于JUnit框架,我们可以把测试代码运行在本地JVM上面,也可以运行在安卓设备上面。运行在本地JVM上和安卓设备上的测试代码所在的位置是不一样的,下面先来学习一下这两种测试类型代码所在的位置。 测试代码运行在本地JVM【本地单元测试】: 代码位置: module-name/src/test/java/ 运行在本地JVM的测试代码是获取不到Android框架API的测

2017-06-01 20:13:51 360

原创 MySQL触发器入门

参考博客http://www.cnblogs.com/duodushu/p/5446384.html触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGG

2017-05-31 23:52:26 362

原创 JAVA的动态代理入门

Java动态代理采用反射的机制,在程序运行时动态生成代理类。我们可以采用Java动态代理机制来对被代理类的一些方法实现增强的行为。Spring的APO也是基于动态代理来实现的。 实现动态代理有两种方法,第一种是基于JDK的Proxy类,一种是基于CGLIB。JDK的动态代理只能是针对于接口代理,如果需要对类进行动态代理只能使用CGLIB了。本篇博客之讨论基于JDK的动态代理。 首先,我们需要一个

2017-05-31 18:15:56 359

转载 从头到尾打印链表(递归思想)

输入一个链表,从尾到头打印链表每个节点的值。思路递归调用public class Solution { ArrayList<Integer> arrayList=new ArrayList<Integer>(); public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { if(list

2017-05-12 23:11:23 465

转载 二维数组的查找

题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路首先我们选择从左下角开始搜寻,(为什么不从左上角开始搜寻,左上角向右和向下都是递增,那么对于一个点,对于向右和向下会产生一个岔路;如果我们选择从左下脚开始搜寻的话,如果大于就向右,如果小于就向下)。public class

2017-05-12 22:56:51 201

原创 工厂模式

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。工厂模式定义我们以类Sample为例, 如果我们要创建

2017-05-10 11:59:15 276

原创 归并排序

归并排序使用了分治思想,操作模式如下:1 分解 分解待排序的n的元素成各具n/2个元素的两个数组2 解决 使用归并排序递归地排序两个数组3 合并 合并两个已排序的数组//上面的三个步骤会被递归调用下面我们来看看合并步骤的伪代码MERGE(A,p,q,r) // p<=q<r1 n1=q-p+12 n2=r-p3 let L[1..n1+1] and R[1..n2+1] be new ar

2017-05-06 10:58:21 230

原创 二叉堆和优先队列

优先队列是一种用来维护由一组元素构成的集合S的数据结构,其中的每一个元素都有一个相关的值,称为关键字。优先队列有最大优先队列和最小优先队列。 优先队列和一般的FIFO队列不一样,从优先队列获取出来的值是哟优先顺序的。例如,用来处理发送给计算机部门打印机的职位:部门主管发来的职位应该首先被打印,依次是经理,研究生和本科生。放到优先队列的值应该是发送的优先顺序(比如主管是5,经理是3,研究生是2,大学

2017-05-04 20:45:16 353

原创 二叉堆和堆排序

(二叉)堆是一个数组,它可以近似看作完全二叉树。树上的每一个节点对应数组中的一个元素。除了最底层,该树是完全充满的,而且是从左向右填充。 根据节点下标可以求出对应的子树和双亲 PARENT(i) return [i/2] //i表示数组中的第几个元素,[i/2]表示取整数 LEFT(i) return 2*i RIGHT(i) return 2*i+1二叉堆可分为

2017-05-04 17:17:44 560

原创 优秀资源整理(持续更新)

【社区相关】IBM技术社区https://www.ibm.com/developerworks/cn/topics/ 极客学院WIKIhttp://wiki.jikexueyuan.com/【Maven】 maven项目多模块配置【IT面试经验】 面试经验http://www.itmian4.com/【Android相关】 Android IPC Retrofit经典讲解博客【Java后端

2017-05-03 08:41:32 376

翻译 Java NIO系列博客之Channel篇

Java NIO的通道(Channel)有点类似于流,但是和流有下面几点不同通道可以同时进行数据的读和写,但是流要么读要么写数据通道可以异步读和写数据通道可以一直我那个缓冲区写数据或者从缓冲区读数据Channel的实现类FileChannel// 从文件读数据或者写数据到文件DatagramChannel//通过UDP来读/写数据SocketChannel//通过TCP读/写数据Ser

2017-05-02 17:59:30 308

翻译 Java NIO系列博客之组件篇

Java NIO包含以下三个核心组件Channels 通道Buffers 缓冲区Selectors 选择器 Java NIO有许多组件和类,但是以上三个组件是NIO API的核心。其它的组件,比如管/文件锁仅仅是以上三个核心组件在连结的时候的工具类。Channels and Buffers通道有点类似流,数据的读写都是通过通道进行的。下面列举几个常见的Channel是实现类FileCha

2017-05-02 11:43:46 252

翻译 Java NIO系列博客之术语篇

Java NIO是JDK1.4提出来的,NIO提供了一套和标准IO不一样的处理IO操作的方式。Java NIO常见术语如下Java NIO:管道和缓冲区在标准的IO API中,我们经常和字节流/字符流打交道,但是在NIO中,我们却是和管道/缓冲区打交道。Java NIO: Non-blocking IOJava NIO是的我们可以做非阻塞IO操作,例如一个线程可以请求一个管道把数据读到缓冲区。当管道

2017-05-02 11:20:27 229

原创 HashMap源码于都笔记

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { private static final long serialVersionUID = 362498820763181265L; /** * 默认的大小- 必须是2的次幂

2017-05-02 10:35:34 257

原创 LinkedList源码阅读笔记

LinkedList内部维护了链表的数据结构来实现队列。取操作效率低,插入操作效率高public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ transient int size =

2017-04-30 23:41:57 207

原创 AarrayList源码阅读笔记

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ private static final long serialVersionUID = 8683452581122892189L;

2017-04-30 21:53:06 327

原创 Java编程思想之《初始化与清理》学习笔记

在这一章中,涉及到的知识点:方法重载this关键字static关键字垃圾回收和终结处理成员初始化构造器初始化一 方法的重载方法重载的方式有两种 (1)参数类型列表不同 (2)参数类型顺序不同二 this关键字this关键字表示当前的引用,在方法中使用表示调用当前方法的对象。那么,当前的引用是怎么获取到的呢?看图:使用this关键字,还可以在多构造函数的类中在一个

2017-04-29 11:15:43 373

原创 Volley源码阅读之请求队列(RequestQueue)工作原理

请求队列RequestQueue是一个拥有分发器线程池的请求分发队列。把一个请求入队,那么可能会执行缓存分发器队列里面的请求,也可能直接执行网络分发器队列里面的请求。如果请求有存在在缓存分发器队列中,那么根据特定条件来执行(到底如何执行请求的,请看上一篇博客Volley源码阅读之缓存分发器(CacheDispatcher)工作原理)。 下面,我们先来看RequestQueue的几个成员变量以及

2017-04-17 17:25:29 347

原创 Volley源码阅读之缓存分发器(CacheDispatcher)工作原理

CacheDispatcher提供线程来执行在请求队列上缓存级别的请求。缓存分发器也是一个线程类:public class CacheDispatcher extends Thread下面来看看它的成员变量以及作用/**控制日志打印*/private static final boolean DEBUG = VolleyLog.DEBUG; /** The queue of requests

2017-04-17 16:30:36 418

原创 Volley源码阅读之网络分发器(NetworkDispatcher)的工作原理

Volley的NetworkDispatcher本质上是一个线程类,它继承自Thread,目的在于提供一个线程来分发请求队列里面的请求:public class NetworkDispatcher extends Thread先来看看NetworkDispacher有哪些成员变量以及作用 /** 请求队列 */ private final BlockingQueue<Request<?>>

2017-04-17 12:09:20 307

原创 快速排序C实现

参考资源:《啊哈!算法》#include <stdio.h>void quickSort(int *arr,int left, int right){ if(left>right)//跳出递归的条件 return; int i,j,temp; temp=arr[left];//选取第一个数为基数 i=left; j=right; wh

2017-04-10 12:56:16 310

AES和RSA加密学习Demo

Java/Android的AES/RSA加密算法使用Demo

2017-04-05

手动创建第一个Maven项目

手动创建第一个Maven项目

2016-08-15

空空如也

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

TA关注的人

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