自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ZSW

  • 博客(67)
  • 问答 (8)
  • 收藏
  • 关注

原创 锁实现原理

本文从happens-before关系出发,结合ReentranLock源码,如何用内存屏障、CAS操作、LOCK指令实现锁的功能。

2017-12-25 20:57:59 2241

原创 Volatile实现原理

读写volatile变量就像是访问一个同步块一样,是原子的且是可见的,总是能访问到最新的值。其底层使用了Lock前缀和内存屏障保证可见性。

2017-12-25 11:16:25 1225

原创 内存屏障保证缓存一致性

缓存一致性协议给缓存行(通常为64字节)定义了个状态:独占(exclusive)、共享(share)、修改(modified)、失效(invalid),用来描述该缓存行是否被多处理器共享、是否修改。所以缓存一致性协议也称MESI。

2017-12-24 15:32:59 1424

原创 从源代码到Runtime发生的重排序

源代码和Runtime时执行的代码很可能不一样,这是因为编译器、处理器常常会为了追求性能而改变执行顺序。然而重排序很危险,很有可能使得运行结果和预想的不一样,特别是当重排序共享变量时。从源代码到Runtime需要经过三步的重排序:编译器重排序->指令重排序->内存系统重排序编译器重排序。

2017-12-22 15:49:03 312

原创 Java内存模型—JMM

有时候编译器、处理器的优化会导致runtime与我们设想的不一样,为此Java对编译器和处理器做了一些限制,JAVA内存模型(JMM)将这些抽象出来,这样编写代码时就无需考虑那么多底层细节,并保证“只要遵循JMM的规则编写程序,其运行结果一定是正确的”。

2017-12-21 17:00:06 256

原创 锁原理:偏向锁、轻量锁、重量锁

java中每个对象都可作为锁,锁有四种级别,按照量级从轻到重分为:无锁、偏向锁、轻量级锁、重量级锁。每个对象一开始都是无锁的,随着线程间争夺锁,越激烈,锁的级别越高,并且锁只能升级不能降级。

2017-12-18 16:15:16 12275 3

原创 操作系统启动顺序

概述在这里以x86的处理器为例 机器在启动的时候会执行第一条指令。这条指令会去执行bios,将控制权交给bios。 bios完成硬件的质检,然后将bootloader从硬盘读到内存中,执行bootloader,并将控制权交给bootloader bootloader负责使能保护模式、建立段机制以及加载操作系统,然后将控制权交给操作系统 第一条指令执行机器的第一条指令是为了跳转到bios执行,

2016-11-15 13:20:26 937

原创 web服务器集群

概述集群和分布式都是从集中式进化而来的。分布式和集群会相互合作的,同时的集群和分布式。在这里重点说说集群集群是什么?集群能提高单位时间内处理的任务数量,提升服务器性能 有多台服务器去处理任务,但是每个任务都是由一台服务器独立完成的 分布式是什么?分布式能缩短单个任务处理的时间 跟集群一样,也有多台服务器去处理任务,但是每个任务由多台服务器合作完成,每台服务器负责完成大任务中的一个小任务 集中

2016-11-07 22:40:02 385

原创 jvm内存溢出分析

概述jvm中除了程序计数器,其他的区域都有可能会发生内存溢出内存溢出是什么?当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出内存溢出和内存泄漏有什么区别?内存泄漏是由于使用不当,把一部分内存“丢掉了”,导致这部分内存不可用。 当在堆中创建了对象,后来没有使用这个对象了,又没有把整个对象的相关引用设为null。此时垃圾收集器会认为这个对象是需

2016-11-07 13:43:23 364

原创 jvm内存区域

概述jvm内存分为几个区域: - 程序计数器 - 虚拟机栈 - 本地方法栈 - 堆 - 方法区 - 运行时常量池 - 直接内存 这些内存区域是在java进程中细分的,为java程序提供服务 不同的区域存储的内容不一样,生命周期的也不一样内存区域程序计数器这个就跟处理器中的程序计数器的功能差不多,是记录下一条字节码的地址 不过处理器的程序计数器是为进程服务的,jvm中的程序计数器是

2016-11-05 15:12:40 267

原创 jdk源码分析红黑树——插入篇

红黑树是自平衡的排序树,自平衡的优点是减少遍历的节点,所以效率会高。如果是非平衡的二叉树,当顺序或逆序插入的时候,查找动作很可能会遍历n个节点红黑树的规则很容易理解,但是维护这个规则难。一、规则1.每个节点要么是红色、要么是黑色2.根节点一定是黑色3.红色节点不可以连续出现(父节点、子节点不可同时为红)4.从任意节点出发,到树底的所有路线,途径的黑节点数量必须相同在修改

2016-11-01 18:00:27 430

原创 jdk源码分析PriorityQueue

一、结构PriorityQueue是一个堆,任意节点都是以它为根节点的子树中的最小节点堆的逻辑结构是完全二叉树状的,存储结构是用数组去存储的,随机访问性好。最小堆的根元素是最小的,最大堆的根元素是最大的这是一个最小堆的逻辑结构这是他的存储结构,是用数组来存储的。可以看到,i下标的数组元素,他的父节点是(i-1)/2,他的左右节点分别是i*2+1,i*2+

2016-10-31 16:09:18 355

原创 jdk源码分析ArrayDeque

ArrayDeque数组循环队列,这个数据结构设计的挺有意思的。据说此类很可能在用作堆栈时快于 Stack,在用作队列时快于 LinkedList。一、容量1.1默认容量是8=2^31.2指定初始化容容量 public ArrayDeque(int numElements) { allocateElements(numElements);

2016-10-27 19:46:56 401

原创 jdk链表笔记

一、LinkedListLinkedList是双链表,并且有头尾指针1.随机访问的优化node(index)该方法用于获取根据下标获取节点,亮点在于,先判断index是size的前半段还是后半段,来决定是用头节点遍历还是为节点来遍历2.要有解除引用的习惯unlinkFirst、unlinkLast、unlink、clear,这种删除节点的方法,都会把该节点的所有引用以及其他对象

2016-10-26 16:07:11 534

原创 jdk顺序表笔记

一、AbstractCollection提供了集合的最大实现继承该类,必须实现size()和iterator(),因为该类操作集合都是通过iterator二、fail-fast策略该策略在集合框架中多次被应用一种多线程对同一集合操作的保护措施,确保操作目标没有被其他线程操作过,与cas思想有异曲同工之处具体在集合中的实现:定义一个全局变量modCount,表示集合被修改

2016-10-26 13:49:01 305

原创 SpringMVC类型转换器、属性编辑器

对于MVC框架,参数绑定一直觉得是很神奇很方便的一个东西,在参数绑定的过程中利用了属性编辑器、类型转换器参数绑定流程参数绑定:把请求中的数据,转化成指定类型的对象,交给处理请求的方法 请求进入到DisptacherServlet,卸下请求中的数据 DisptacherServlet将请求中的数据发送给Controller 获取Controller需要接收的参数

2016-07-16 17:03:13 576

原创 springMVC基本使用

springMVC是一个MVC框架,他控制着请求相应的整个流程,从请求一进入到应用服务器到相应离开,都离不开mvc框架请求在应用服务器中先说说请求相应在应用服务器的整个过程 DisptacherServlet接收到请求,并读取出请求中的数据 DisptacherServlet根据请求中的信息(url),去Handlermapping中查找url对应的资源(如果没有则

2016-07-15 02:41:12 842

原创 spring整合hibernate

spring整合hibernate包括三部分:hibernate的配置、hibernate核心对象交给spring管理、事务由AOP控制好处: 由java代码进行配置,摆脱硬编码,连接数据库等信息更灵活 session等生命周期得到更好的控制,session和事务依赖注入到DAO中,更爽 事务由AOP管理更加清晰,自动管理事务hibernate的配置spr

2016-07-14 22:19:09 459

动态代理

代理就像个中介,最外层操作代理对象,代理对象再调用委托对象当需要在调用前后做一些处理,但是这些处理与业务逻辑无关的时候,如果把无关代码写在业务逻辑里面,代码就会变得很乱,这时候用代理就再好不过了。就像spring的aop编程,也是用了代理,在调用前后做一些校验、日志记录等无关业务流程的事因为要通过代理对象去调用委托对象,所以代理对象需要持有委托对象的引用,而且代理类中需要实现委托对象...

2016-07-14 00:26:39 71

原创 spring aop注解配置

spring aop是面向切面编程,使用了动态代理的技术,这样可以使业务逻辑的代码不掺入其他乱七八糟的代码可以在切面上实现合法性校验、权限检验、日志记录。。。spring aop 用的多的有两种配置方法:注解配置和xml配置注解配置更好,友好重构、错误也好检查在这里只讲注解配置aop概念 切面:切面类,里面有切点有通知,切面包括了一切(在哪切,干什么)

2016-07-14 00:17:08 519

原创 代理

代理就像个中介,最外层操作代理对象,代理对象再调用委托对象当需要在调用前后做一些处理,但是这些处理与业务逻辑无关的时候,如果把无关代码写在业务逻辑里面,代码就会变得很乱,这时候用代理就再好不过了。就像spring的aop编程,也是用了代理,在调用前后做一些校验、日志记录等无关业务流程的事因为要通过代理对象去调用委托对象,所以代理对象需要持有委托对象的引用,而且代理类中需要实现委托对象的

2016-07-13 16:44:21 293

原创 装配bean

spring有三种装配bean的方式:隐式装配、java代码装配、xml装配隐式装配最为省事方便,也称为自动化装配java代码装配最为强大、安全、友好重构这三种装配方式可以混搭着来用隐式装配和java代码装配都是注解配置在这里通过一个例子来讲述配置 有一个CD播放器,要依赖CD才能播放CD的两个实现,一个是ThinkingJA

2016-07-12 23:00:20 383

原创 apache反向代理

正向代理是客户端发送请求给代理服务器,代理服务器将请求发给实际处理的服务器反向代理是客户端发送请求给服务器(实际上是个代理服务器),服务器将请求发给实际处理的服务器情景在一台服务器上开了apache(侦听80端口),又开了tomcat(侦听8080端口)顶级域名解析到了apache这个服务器,想用二级域名访问到tomcat服务器下面的某个项目解决方案一、泛解析域名

2016-06-14 11:36:44 603

原创 实现二级域名

实现二级域名有几种方式 服务器做反向代理 服务器设置域名配置 更改服务器默认访问项目服务器反向代理可以参考http://www.wewill.top/2016/06/14/apache反向代理/在这里主要说说服务器设置域名转发服务器域名配置<Host name="examples.localhost" appBase="webapps"unpa

2016-06-14 11:36:15 1629

实现二级域名

 实现二级域名有几种方式服务器做反向代理服务器设置域名配置更改服务器默认访问项目服务器反向代理可以参考http://www.wewill.top/2016/06/14/apache反向代理/在这里主要说说服务器设置域名转发服务器域名配置 &lt;Host name=”examples.localhost” appBase=”webapps”unpa...

2016-06-14 11:36:00 186

原创 struts拓展restful

为restful开发的话,一定要设计到URL,struts正好是管理URL的所以在struts的项目中用restful,要遵守struts的规则rest在struts中对应的方法上面是官方给出的帮助文档(默认情况下) get,不带id参数——index get,带id——show post,不带id——create put,带id——update

2016-06-07 23:04:33 571

原创 restful是什么

resful是什么rest是一种开发的风格,他不是框架,也没有类库,是一种约定有什么不同非restful的开发方式当没有接触restful的时候,URL通常是动词,比如127.0.0.1:8080/unrestful/getFilerestful的开发方式restful的URL是名词,比如127.0.0.1:8080/restful/file通过请求消息的metho

2016-06-07 21:50:32 1335

原创 struts的声明式异常处理

情景使用Struts封装的下载文件的功能当下载文件找不到的时候,struts获取的InputStream为null这个时候,就会报500错误java.lang.IllegalArgumentException : Can not find a java.io.InputStream with the name [downloadFile] in the invocati

2016-06-04 16:50:58 406

原创 linux常用命令之压缩打包

gzipgzip - compress or expand files,压缩或解压缩文件默认为压缩压缩文件后缀:.bz2用法gzip [-dv] file选项 -d decompress,解压缩 -v 显示压缩比 -接数字,表示压缩程度,-1最快,但是压缩比最小,-9最慢,压缩比最大,默认-6最好demo可以看到,压缩后的文件名

2016-06-04 16:05:03 369

原创 linux常用命令之文件系统

dfdf - report file system disk space usage 查看文件系统的使用清空用法df [-hi] [path]选项 -h human readable ,以人类易读的方式显示size -i inode 显示inode,不显示硬盘容量demo注意 df后面接path的话,会输出这个path所在的文件

2016-06-03 21:24:40 315

原创 硬连接与软连接,inode与links

硬连接和软连接,第一感觉就像是window的快捷方式,实则不然要说硬连接和软连接,那就必须了解inode和block以及分区了EXT文件系统在创建分区的时候,就划分了两块区域,inode table和date blockinodeinode - index node ,索引节点每一个inode固定分配了128bytes的空间一个文件和目录对应着一个inode多个文件

2016-06-03 20:49:14 349

原创 linux常用命令之查阅文件

catcat - concatenate print files 连续的输出文件内容用法cat [-nbA] file选项-n line number 输出行号-b line number nonblank 输出空白行的行号-A show All 显示特殊字符tactac - concatenate print files reverse 反序的查看

2016-06-02 11:38:00 528

原创 linux常用命令之文件管理

mkdirmkdir - make directories 新建目录用法mkdir [-mp] 路径选项-m mode   set file mode (as in chmod)设置目录的权限,就像chmod一样,是数字模式默认的权限是:770demo:mkdir -m 700 xxxxx-p parent如果父目录不存在,则会自动新建父目录

2016-06-01 23:50:46 279

原创 linux常用命令之文件权限

lsls:list directory contents默认情况选项-a 列出全部文件及目录包括隐藏的-l 列出详细信息,包括文件类型、权限、节点、owner、group、size(b)、更新日期、文件名参数文件名或者目录名,列出该文件名或目录名的信息chgrpchgrp - change group ownership,改变组别的所有权

2016-06-01 19:44:45 366

原创 浅谈spring security 403机制

403就是access denied ,就是请求拒绝,因为权限不足三种权限级别一、无权限访问这种即是不需要登录,也可以访问的,但是不会传csrf_key二、匿名访问这种也是不需要登录就访问的,但是会传csrf_key三、有权限访问这种就需要用户登录了,而且需要相应的权限才能访问,不然就报403(access denied)

2016-06-01 11:51:20 10779

原创 把复杂json解析成javabean

工具:fastjson1.2.9用其他工具也行,比如json-lib、gson用法都差不多先来一段json{ "page": { "pagenow": "1", "pagesize": "20" }, "file": { "name": "jpg" }, "catalogs"

2016-05-31 20:00:09 727

原创 spring 整合 struts

struts配置objectFactory在struts.xml添加,用spring工厂管理action对象action的class以前配置action的时候是现在改为class="id" >id是在spring中配置的action bean的id通过id访问,才能实现由spring管理action对象spring配置当出现Conversio

2016-05-31 15:44:39 294

原创 servletcontext监听器的启动位置以及tomcat和eclipse的目录结构

情景:想在应用启动的时候就加载spring容器在ServletContextListener.contextInitialized()中加载spring容器ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");结果发现一直报"找不到文件的IO错误",于是就打印下当

2016-05-30 23:51:37 740

原创 获取spring容器要小心的坑

情景:今天想把一个web应用中的上传路劲更改一下于是就在配置文件作了如下变动:"C:\\Users\\admin\\Desktop\\upload"然后savePath这个变量仍然没有生效然后就想,会不会是没有关联到配置文件ApplicaitonContext的几种生成方法一、ClassPathXmlApplicationContext这种方式是通过类名

2016-05-30 22:16:25 1392

原创 正确的前端传后台json方式

DEMO:var data=JSON.stringify({"page": {"pagenow": 1,"pagesize": 20},"file":{"name":"jpg"},"catalogs":[{"id":1},{"id":2}]}); $.ajax({ type:"POST", url:"//访问的url",

2016-05-30 20:31:18 17558 2

空空如也

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

TA关注的人

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