自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LintCode 71 -- 二叉树的锯齿形层次遍历

LintCode 71 - 二叉树的锯齿形层次遍历自己ac了一遍之后, 发现google排名靠前的少有Java版的实现, 这里贴上我自己的实现.思路非常简单, 使用双端队列作为层次遍历的支持结构, 然后用一个布尔型变量控制下一层遍历是队头出还是队尾出.public class Solution { /** * @param root: The root of binary tree

2017-08-06 17:20:24 499

转载 浅谈CSRF攻击方式

原文链接: https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html一.CSRF是什么?  CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。二.CSRF可以做

2017-04-16 21:37:18 717

转载 八幅漫画理解使用JSON Web Token(JWT)设计单点登录系统

原文链接:   http://blog.leapoahead.com/2015/09/07/user-authentication-with-jwt/用户认证八步走所谓用户认证(Authentication),就是让用户登录,并且在接下来的一段时间内让用户访问网站时可以使用其账户,而不需要再次登录的机制。小知识:可别把用户认证和用户授权(Authorization)搞混了。

2017-04-16 20:34:17 4773

转载 JWT(JSON Web Token) - 在Web应用间安全地传递信息

原文链接: http://blog.leapoahead.com/2015/09/06/understanding-jwt/JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。让我们来假想一下一个场景。在A用户关注了B用户的时候,系统发邮件给B用户,并且附有一个链接“点此关注A用户”。链接的地址可以是这样的

2017-04-16 20:31:27 3583

原创 微服务--分布式事务的实现方法及替代方案

微服务–分布式事务的实现方法及替代方案这两天正在研究微服务架构中分布式事务的处理方案, 做一个小小的总结, 作为备忘. 如有错误, 欢迎指正!概念澄清事务补偿机制: 在事务链中的任何一个正向事务操作, 都必须存在一个完全符合回滚规则的可逆事务.CAP理论: CAP(Consistency, Availability, Partition Tolerance), 阐述了一个分布式系统的三个主要方面

2017-04-16 13:41:02 66293 8

原创 Spring核心技术--AOP

Spring核心技术–AOP在OOP中, 模块化的单位是class, 在AOP中, 模块化的单位是aspect.Spring IoC容器并不直接与AOP模块耦合, AOP模块是作为一个中间件方案提供给IoC容器使用的.声明式事务管理就是AOP在Spring框架中的一个典型实现, 另外, 池化也是一个典型的应用.对于Spring AOP编程来说, 推荐使用能够完成需求功能的最小Advice种类进行实现

2017-04-11 14:38:39 1196

原创 Spring核心技术--IoC container用法详解

一直在使用Spring提供的IoC容器, 但是始终没有系统化的梳理一下. 今天在这里写下, 也是以备以后参考之用.Ioc container的核心是BeanFactory接口, 它提供的方法能够管理任何类型的对象. ApplicationContext是它的子接口, 集成了Spring AOP的特性.BeanFactory or ApplicationContext? BeanFactory目前

2017-04-10 20:01:16 3352

原创 MyBatis Mapper XML文件详解

MyBatis Mapper XML文件详解首先需要澄清几个概念:namespace 就是Mapper XML对应的Java接口名.联合查询: 也就是多表的各种join查询关联映射: 也就是嵌套映射, 用在一个POJO中包含其他POJO的情况Mapper XML顶级配置元素cache 启用本xml对应的namespace的二级缓存cache-ref 共享指定namespace的二级缓存

2017-04-09 15:40:39 6374

原创 Spring 缓存使用

生效原理抽象而不是实现Spring框架中, 缓存服务是一组抽象, 也就是一组API, 由org.springframework.cache.Cacheorg.springframework.cache.CacheManager抽象. 抽象中并不包含多线程或者多进程处理逻辑, 这些逻辑应该由缓存实现方提供. Spring data工程默认提供了一些实现, 例如ConcurrentHashMap,

2017-04-08 19:45:49 4743

转载 Java日志全解析(上) - 源流

作为Java程序员,幸运的是,Java 拥有功能和性能都非常强大的日志库;不幸的是,这样的日志库有不止一个——相信每个人都曾经迷失在JUL(Java Util Log), JCL(Commons Logging), Log4j, SLF4J, Logback,Log4j2 等等的迷宫中。在我见过的绝大多数项目中,都没有能够良好的配置和使用日志库。

2017-03-31 16:28:28 1542

原创 JVM - 内存区域划分 与 内存溢出异常

主要介绍以下内容: Java虚拟机内存的各个区域, 这些区域的作用, 服务对象以及其中可能产生的问题运行时数据区域概览图程序计数器(Program Counter Register)可以看做当前线程所执行的字节码的行号指示器. 在多线程程序中, 为了线程切换后能恢复到正确的执行位置, 每条线程都需要一个独立的程序计数器, 独立存储, 我们称这类内存区域为线程私有的内存.如果正在执行一个Java方法,

2017-03-20 22:17:18 925

原创 JVM - 垃圾收集器与内存分配策略

当前GC技术已经基本自动化了, 为什么我们需要了解GC和内存分配呢? 答案是: 当需要排查各种内存溢出, 内存泄露问题时, 当垃圾收集成为系统达到更高并发量的瓶颈时, 我们就需要对这些”自动化”的技术实施必要的监控和调节.在GC上, 程序计数器, 虚拟机栈, 本地方法栈这三个区域随着线程而生灭, 内存的分配和回收都是完备的, 不需要考虑回收问题. 本章主要基于Java堆和方法区来讨论.判断对象是否可

2017-03-20 22:15:53 34

转载 JMX学习笔记(一)-MBean

一个MBean是一个被管理的Java对象,有点类似于JavaBean,一个设备、一个应用或者任何资源都可以被表示为MBean,MBean会暴露一个接口对外,这个接口可以读取或者写入一些对象中的属性,通常一个MBean需要定义一个接口,以MBean结尾, 例如: EchoMBean, 格式为XXXMBean,这个是规范,必须得遵守

2017-03-20 19:24:11 462

转载 java Future用法和意义 - 一句话击破

在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果。 所以run的返回值是void类型。 如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使用多线程来计算。 但后者需要前者的结果,就需要用callable接口了。 callable用法和runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以

2017-03-07 14:49:40 1312

原创 Java并发编程 - 基础

并发的历史操作系统的发展使得多个程序能够同时运行, 由操作系统来分配资源, 如果需要的话, 进程会通过一些原始的机制相互通信, 主要分为消息传递和共享内存两种:消息传递: Socket, 信号处理(signal handlers), 信号量(semaphores)和文件等.共享内存线程共享其所属进程的内存地址空间, 因此所有同一进程中的线程访问相同的变量, 并从同一个堆中分配对象, 这相对于进程

2017-03-07 09:41:13 438

原创 Java并发编程 - 锁 - 原理详解

Java并发编程中, 锁机制对控制线程间共享内存的使用有重要的意义. 那么在Java内部锁是如何实现的呢?首先要明确一个概念. Java中的锁是对象级别的概念, 也就是每个对象都天生可以作为一个锁使用.究其底层实现, 实际上锁是存在于Java对象头的MarkWord字段里的, 根据锁的级别, 存储结构不同, 但是都存在一个2bit的锁标识位.悲观锁悲观锁是synchronize内部的实现机制,

2017-03-07 09:40:31 836

原创 Java并发编程 - 常用容器(ConcurrentHashMap, ConcurrentLinkedQueue)

ConcurrentHashMap的实现原理与使用传统的HashMap不是线程安全的, 所以多线程进行put()和get()操作的时候可能会引发问题. 还有一个叫做HashTable的数据结构, 它使用的是synchronized来保证线程安全, 但是效率很低, 因为不能并发读.ConcurrentHashMap采用的是锁分段技术, 将数据分成一段一段存储, 然后给每一段数据配一把锁, 当一个线

2017-03-07 09:40:09 1913

原创 Java解惑 - sleep和wait/notify机制, 线程阻塞和等待的区别

sleep()方法sleep()方法是定义在Thread上的native方法, 在设定时间段内(精度取决于CPU)阻塞线程的执行, 但是并不更改线程的锁持有情况.wait/notify机制wait()方法是定义在Object上的方法, 是java语言级的方法, 需要在同步块或者同步方法中进行调用, 会释放锁, 并进入锁对象的等待队列, 需要等到其他线程调用notify()方法释放锁后(实际上该线程

2017-03-07 09:39:24 12199 1

原创 Java并发编程 - volatile, synchronize关键字实现原理

Java代码在编译后会变成Java字节码, 字节码被ClassLoader加载到JVM中, JVM执行字节码, 最终要转化为汇编指令在CPU上执行, Java中所使用的并发机制依赖于JVM的实现和CPU的指令.volatile原语volatile是轻量级的synchronized, 它在多CPU(注意不仅仅是多核)开发中保证了共享变量的可见性. 由于volatile只保证了可见性, 无法保证原子性

2017-03-07 09:38:38 1735

原创 Java - 迭代器的使用

迭代器主要是为了支持容器类的遍历, 发展历程如下.Java 1.5 之前的做法如果你用的是Java 1.5之前支持的类库, 那么很可能采用的是如下的做法来遍历集合元素: 使用iterator()要求容器返回一个Iterator, Iterator将准备好返回序列的第一个元素;使用next()获得序列中的下一个元素;使用hasNext()检查序列中是否还有元素;使用remove()将迭代器返回

2017-03-07 09:37:28 8269

原创 Java 8 - 通过lambda表达式进行惰性计算

lambda表达式的出现使得JDK8内部发生了很多有趣的变化, 其中就包括惰性计算的特性. 这里以JDK标准库中的Logger为例, 1.8以前的log方法有如下签名:public void log(Level level, String msg) { if (!isLoggable(level)) { return; } L

2017-03-07 09:36:57 1770

原创 Java并发编程- 内存模型详解

本文分为四个部分来讲解:Java内存模型的基础, 主要介绍内存模型相关的基本概念;Java内存模型中的顺序一致性, 主要介绍重排序与顺序一致性内存模型;同步原语, 主要介绍三个同步原语(synchronized, volatile, final)的内存语义及重排序规则在处理器中的实现;Java内存模型的设计, 主要介绍Java内存模型的设计原理, 及其与处理器内存模型和顺序一致性内存模型的关

2017-03-07 09:36:17 550

原创 Java并发编程 - 线程池

线程池是一种生产者/消费者模式的实现.线程池处理任务的流程ThreadPoolExecutor是一种线程池的实现, 它执行execute()的处理流程如下:上图中与新创建线程有关的步骤都需要获取全局锁, 所以线程池中应当尽量避免进行新线程的创建. 实际上在ThreadPoolExecutor完成预热之后(corePoolSize已满)的时候, 几乎所有的execute()方法都是执行入队操作.

2017-03-07 09:35:51 292

原创 Java并发编程 - Executor框架详解

Executor框架(接口)负责在用户级别进行任务的调度和执行, 实现了任务调度和执行的分离.Executor框架简介Executor框架的两级调度模型在上层, Java程序通过将应用分解为若干个任务(task), 然后使用用户级的调度器(Executor框架)将task映射为固定数量的Java线程.在底层, Java线程与操作系统的线程是一一对应的关系, 由操作系统调度给可用的CPU. 底层的调

2017-03-07 09:35:25 558

原创 Java - 日志收集与处理

日志的出现是为了弥补使用System.out.println()进行调试的不足. 因为打印语句需要我们一条一条手动控制.日志的管理分为两大部分:日志记录器日志处理器日志记录器负责按设定级别对日志进行记录和向上传递, 日志处理器负责按设定级别对日志进行打印.日志记录器使用全局日志记录器最简单的使用情况是通过调用Logger.getGlobal()获得全局日志记录器. 然后通过info()这样的方

2017-03-07 09:34:48 5434

原创 JVM - 内存区域划分 与 内存溢出异常

主要介绍以下内容: Java虚拟机内存的各个区域, 这些区域的作用, 服务对象以及其中可能产生的问题运行时数据区域概览图程序计数器(Program Counter Register)可以看做当前线程所执行的字节码的行号指示器. 在多线程程序中, 为了线程切换后能恢复到正确的执行位置, 每条线程都需要一个独立的程序计数器, 独立存储, 我们称这类内存区域为线程私有的内存.如果正在执行一个Java方法,

2017-03-07 09:33:58 793

原创 MongoDB索引-初级篇

为什么要使用索引下面以一个例子来说明: 假设我们现在有一个100w条的文档数据, 每个文档数据都包含一个username字段, 其值从user1到user1000000, 假定我们希望通过username进行查询.> db.user.find({username: "user101"})我们可以在查询的同时开启操作的监控:> db.user.find({username: "user101"}).e

2017-03-07 09:32:55 236

原创 Heroku连接云端MongoDB的方法

之前我们已经简单的在Heroku上部署了正在开发的web应用, 现在我们的应用要使用MongoDB数据库, 如何在云端部署一个MongoDB连接呢?再进一步, 最终我们的目的是生产和开发环境连接不同数据库. 本文将完整叙述整个流程.注册MongoLab账号我们这里将使用MongoLab, 首先需要注册账号, 相关文档请见这里创建一个新数据库登陆后按照如下操作选择single node, sandbo

2017-03-07 09:30:48 2021

原创 Oracle到MySQL数据库迁移之--主键生成策略替换

Oracle数据库到MySQL数据库迁移过程中的一大难题就是主键生成策略的替换. 如果之前的程序中使用Oracle的Sequence机制来实现主键的自增的话. MySQL中需要使用TableGenerator进行等价替换.替换的时候, 主要有三个地方需要修改:以注解方式完成hibernate映射的实体;以xml方式完成hibernate映射的实体;数据库存储过程;注解方式完成hibernat

2017-03-07 09:29:54 2943

原创 从零构建部署Node.js+Express+Bootstrap Web应用

本文将包括以下内容:创建一个Express应用使用npm和package.json管理应用依赖调整Express工程结构到MVC架构Route和Controller概念分离创建新的Node模块(module)使用Git在线部署Express应用到Heroku在进行一切操作之前, 需要先安装好Node.js, 对于*nix用户来说, 直接下载解压, 并添加到环境变量中即可完成安装.首先从

2017-03-07 09:29:03 13570 1

原创 使用REST API操作MongoDB(一)

使用REST API, 我们能够通过HTTP请求来对MongoDB进行CRUD操作. REST API对于我们的应用来说就是一个无状态的接口, 对于MEAN技术栈来讲, REST API的地位是创建一个暴露一个操作数据库的无状态接口, 供其他应用操作数据库的数据.设计REST API的请求处理部分REST API功能通常, 我们希望借助REST API完成以下操作 - 创建一个新记录 - 读取一

2017-03-07 09:27:39 7349 1

原创 基础网络概念(十)重点回顾

声明:本文为笔者复习计算机网络相关知识时的摘录,文章中的图片及语句均出自《鸟哥的Linux私房菜》,这里仅作为整理自用。喜欢鸟哥文章的朋友可以到鸟哥的主页查看:http://linux.vbird.org/2.6 重点回顾:    虽然目前的网络媒体多以以太网络为标准,但网络媒体不只有以太网络而已;    Internet 主要是由 Internet Net

2014-12-15 18:52:20 401

原创 基础网络概念(九)一组可以连上 Internet 的必要网络参数

我们知道一部主机要能够使用网络,必须要有 IP ,而 IP 的设定当中,就

2014-12-15 18:50:54 531

转载 基础网络概念(八)IP、主机名与DNS

用 IP 上网 主机名上网 DNS 系统计算机都有主机名嘛! 那么我就将主机名与他的 IP 对应起来,未来要连接上该计算机时,只要知道该计算

2014-12-15 18:49:12 783

原创 基础网络概念(七)网络防火墙与 OSI 七层协议

网络防火墙与OSI 七层协议封包过滤式的网络防火墙可以抵挡掉一些可能有问题的封包, Linux 系统上面是怎么挡掉封包的呢?其实说来也是

2014-12-15 18:46:56 2323

原创 基础网络概念(六)无连接的UDP协议

非连接导向的 UDP 协议UDP 的全名是:『User Datagram Protocol, 用户数据流协议』,UDP 与 TCP 不一样,  UDP 不提供可靠

2014-12-15 18:43:17 1009

原创 基础网络概念(五)TCP/IP传输层相关封包与数据、TCP三次握手

TCP/IP 的传输层相关封包与数据网络层的 IP 封包只负责将数据送到正确的目标主机去,但这个封包到底会不会被接受,或者是有没有被正确的接收,  那就不是 IP 的任务啦!那是传送层的任务之一。2.4.1 可靠联机的 TCP 协议在网络层的 IP 之上则是传送层,而传送层的数据打包成什么? 最常见的就是 TCP 封包了。这个 TCP 封包数据必须要能够

2014-12-15 18:35:20 2685

原创 基础网络概念(三)TCP/IP协议、IP、Netmask、子网、CIDR、路由概念

TCP/IP 的网络层相关封包与数据我们现在知道要有网络的话,必须要有网络相关的硬件,而目前最常见的网络硬件接口为以太网络,包括网络线、网络卡、Hub/Switch

2014-12-15 18:27:44 2005

原创 基础网络概念(二)CSMA/CD、MAC、MTU、集线器与交换机、全双工与半双工

声明:本文为笔者复习计算机网络相关知识时的摘录,文章中的图片及语句均出自《鸟哥的Linux私房菜》,这里仅作为整理自用。喜欢鸟哥文章的朋友可以到鸟哥的主页查看:http://linux.vbird.org/以太网络的传输协议:CSMA/CD集线器是一种网络共享媒体,什么是网络共享媒体啊?想象一下上述的环境就像一个十字路口,而集线器就是那个路口

2014-12-15 18:21:19 2579

原创 基础网络概念(一)OSI模型、TCP/IP、广域网、局域网、以太网

声明:本文为笔者复习计算机网络相关知识时的摘录,文章中的图片及语句均出自《鸟哥的Linux私房菜》,这里仅作为整理自用。喜欢鸟哥文章的朋友可以到鸟哥的主页查看:http://linux.vbird.org/相关缩略词IP:Internet Protocal;NIC:Network Interface Card 网络卡;节点:具有IP地址的设备

2014-12-15 18:11:13 2525

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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