Java
文章平均质量分 66
空灵游侠
这个作者很懒,什么都没留下…
展开
-
netty学习笔记
Netty与原生Nio的区别原生的nio,只简单封闭了ByteBuffer以及Channel,也就是网络IO操作以及对这些字节的缓存,字节的编码与解码、粘包与拆包问题没有API,IO事件的处理只提供了最简单的Handler,没有进一步封装。这就是Netty存在的道理。Java Nio本身只实现了对底层C原生的非阻塞IO、AIO的简单封装,并没有为实际业务场景的使用提供太多的工具。不过这是符合JD原创 2017-04-04 20:13:09 · 277 阅读 · 0 评论 -
分布式系统事务一致性解决方
分布式系统事务一致性解决方案2017-03-10 丁浪 高效开发运维写在前面 在OLTP系统领域,我们在很多业务场景下都会面临事务一致性方面的需求,例如最经典的Bob给Smith转账的案例。传统的企业开发,系统往往是以单体应用形式存在的,也没有横跨多个数据库。我们通常只需借助开发平台中特有数据访问技术和框架(例如Spring、JDBC、ADO.NET),结合关系型数据库自转载 2017-03-12 21:13:00 · 347 阅读 · 0 评论 -
并发编程实战学习笔记(五)——取消与关闭
题记在Java中没有一种安全的抢占方法来停止线程,因此也就没有安全的抢占式方法来停止任务。只有一些协作式的机制,使请求取消的任务和代码都遵循一种协商好的协议。响应中断时执行的操作包括清除中断状态抛出InterrruptedException,表示阻塞操作由于中断而提前结束对中断操作的正确理解调用interrupt并不意味着立即停止目标线程正在进行的工作,而只是传递了请求中断的消息。 它并不会原创 2017-03-10 17:56:30 · 417 阅读 · 0 评论 -
并发编程实战学习笔记(四)——任务执行
无限制创建线程的不足线程生命周期的开销非常高; 创建与销毁过程中都极其耗费资源资源消耗; 活跃的线程会消耗系统资源,尤其是内存。如果可运行的线程数量多于可用处理器的数量,那么有些线程将闲置,大量的线程也会竞争CPU时钟周期,这个时候再创建更多的线程反而会降低性能。稳定性。 线程数量有限制,内存消耗过多,可能会抛出OutOfMemoryErrorExecutor框架原创 2017-03-06 15:12:14 · 308 阅读 · 0 评论 -
并发编程实战学习笔记(六)——线程池的使用
任务与执行策略之间的隐性耦合依赖性任务 当在线程池中执行独立的任务时,可以随意地改变线程池的大小和配置,这些修改只会对执行性能产生影响。如果提交给线程池的任务需要依赖其它的任务,那么就隐含地给执行策略带来了约束,此时必须小心地维持这些执行策略以避免产生活跃性问题“线程饥饿死锁”。 使用线程封闭机制的任务 如果将Executor从单线程环境改为线程池环境,那么将会失去线程安全性。对响应时间原创 2017-03-17 16:26:02 · 626 阅读 · 0 评论 -
编译优化与语法糖
自定义注解的实现机制?自定义注解的实现是与反射机制紧密相联的,当我们为一个类添加注解的时候,我们可以通过反射类来判断是否有某个注解,对应注解中的某个参数是什么等,这样我就可以通过注解来影响我们的程序行为,是自由配置文件来灵活定制功能之后,又一大解耦工具语法糖有哪些?泛型和类型擦除; 自动装箱与拆箱; 遍历循环; 变长参数; 语法糖的实现原理是什么?编译完成之原创 2017-02-16 09:22:22 · 378 阅读 · 0 评论 -
并发编程实战学习笔记(二)——对象的共享
可见性并发程序对变量的写入造成变量状态的改变后,其它线程能够即时的读到完整的、最新的值。volatile加锁机制既能确保可见性也能确保原子性,volatile只能确保可见性;volatile变量的使用条件对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值;该变量不会与其它状态变量一起纳入不变性条件中;在访问变量时不需要加锁;原创 2017-02-26 12:25:08 · 437 阅读 · 1 评论 -
并发编程实战学习笔记(一)——线程安全性问题的本质以及理论概述
线程带来的风险,也是并发编程复杂性的原因安全性问题如共享变量写入的覆盖问题等;活跃性问题如死锁、活锁、饥饿等问题性能问题线程的使用,会带来线程上下文切换的代价、系统资源使用率过高等问题,处理得不够好,也可能达不到我们希望并发模型给我们带来的性能上的上升。线程安全问题的简述概念要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共原创 2017-02-25 17:56:43 · 325 阅读 · 0 评论 -
Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式
本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/java/nio_reactor/Java I/O模型同步 vs. 异步同步I/O 每个请求必须逐个地被处理,一个请求的处理会导致整个流程的暂时等待,这些事件无法并发地执行。用户线程发起I/O请求后需要等待或者轮询内核I/O操作完成后才能继续执行。异步I/O 多个请求转载 2017-04-04 16:31:42 · 400 阅读 · 0 评论 -
netty学习系列:NIO Reactor模型 & Netty线程模型
觉得写得很好,就转载了转载自:http://www.jianshu.com/p/38b56531565d 作者 sunEven 关注2017.03.27 21:24* 字数 2167 阅读 12评论 0喜欢 3一、NIO Reactor模型1、Reactor模式思想:分而治之+事件驱动1)分而治之一个连接里完整的网络处理过转载 2017-04-04 16:52:05 · 2098 阅读 · 1 评论 -
并发编程实战学习笔记(八)——性能与可伸缩性
性能追求与安全性复杂性的矛盾许多提升性能的技术同样会增加复杂性,因此也就增加了在安全性和活跃性上发生失败的风险。并发程序设计的最基本原则首先要保证程序能正确运行,然后仅当程序的性能需求和测试结果要求程序执行得更快时,才应该设法提高它的运行速度。提高程序运行速度的总体思路先使程序正确运行,首先可以从代码内在逻辑层面思考优化点外,通过压测等手段来观察系统资源使用瓶颈,从而实现通过实验数据而不是主观猜想来原创 2017-03-26 16:43:51 · 575 阅读 · 0 评论 -
并发编程实战学习笔记(七)——避免活跃性问题
锁顺序死锁定义试图以不同的顺序去获得相同的锁,就可能会产生死锁解决办法如果所有线程以固定的顺序来获得锁,那么在程序中就不会出现锁顺序死锁问题动态的锁顺序死锁原因锁顺序本身是动态的,无法通过相同的顺序来避免死锁问题解决办法通过一致哈希算法或者其它方式来统一锁顺序,使未知顺序变为已知顺序。对于极少数的哈希冲突,可以使用“加时赛”锁来解决private static final Object tieLoc原创 2017-03-26 11:05:24 · 760 阅读 · 0 评论 -
并发编程实战学习笔记(三)——基础构建模块
同步容器类的问题整个容器类加锁,线性访问容器实例,并发性能非常低虽然单个操作是线程安全的,但是复合操作如果不另外加锁,本身无法保证并发安全迭代器迭代过程中,如果发生元素的操作,会触发ConcurentModificationException异常,使用了“及时失败”机制建议:通过并发容器来代替同步容器,可以极大地提高伸缩性并降低风险ConcurrentHashMap的优化手原创 2017-03-05 17:09:50 · 524 阅读 · 0 评论 -
类加载机制
类加载器层次是怎么样的JVM预定义的三种类型类加载器:启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 /lib下面的类库加载到内存中(比如rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。标准扩展(Extension)类加载器:是由 Sun 的 ExtClassLoad转载 2017-02-16 08:52:48 · 321 阅读 · 0 评论 -
java虚拟机疑问与解答
内存相关1、哪些内存区域是共享的,哪些又是线程私有的? 共享的:方法区、堆 私有的:栈、本地栈、程序计数器2、哪个内存区域不会有OOM? 程序计数器3、哪个区域会有StackOverFlowError? 域区与本地栈GC相关1、如何打开GC日志? 参考:http://ifeve.com/useful-jvm-flags-part-8-gc-log原创 2017-02-12 16:26:35 · 323 阅读 · 2 评论 -
并发编程实战学习笔记(十一)-原子变量与非阻塞同步机制
原子变量在非阻塞算法的应用实现基础用底层的原子机器指令(例如比例并交换指令)代替锁来确保数据在并发访问中的一致性。缺点非阻塞算法在设计与实现上比阻塞算法都要复杂得多。优点在可伸缩性和活跃性上拥有巨大的优势。由于非阻塞算法可以使多个线程竞争相同的数据时不会发生阻塞,因此它能在粒度更细的层次上进行协调,并且极大地减少调度开销。不存在死锁和其它活跃性问题。即使原子变量没有用于非阻塞算法的开发,它们也原创 2017-04-05 17:44:53 · 346 阅读 · 0 评论 -
并发编程实战学习笔记(十)-构建自定义的同步工具
并发编程实战学习笔记(十)-构建自定义的同步工具核心概念【状态依赖】程序在做某一个操作之前,需要依赖另一个操作的完成或者状态的就绪,这样的一种关系就叫做“状态依赖”。状态依赖的实现类,就是并发工具的原语。例如FutureTask、Semaphore和BlockingQueue等。在这些类的一些操作中有着基于状态的前提条件,例如,不能从一个空队列删除元素,或者获取一个尚未结束的任务的计算结果,在这些操原创 2017-04-05 15:48:19 · 343 阅读 · 0 评论 -
并发编程实战学习笔记(九)-显式锁
为什么创建一种与内置锁如此相似的新加锁规则(显示锁)?内置锁的局限无法中断一个正在等待锁的线程,或者获取锁时不支持超时操作。内置锁必须在获取锁的代码块中释放,这就简化了编码工作,并且与异常处理操作实现了很好的互动,但却无法实现非阻塞结构的加锁规则。显示锁的优势轮询锁与定时锁。 可定时的与可轮询的锁获取模式是由tryLock方法实现的,与无条件的锁获取模式相比,它具有更完善的错误恢复机制。在原创 2017-04-05 10:28:53 · 355 阅读 · 0 评论 -
并发的相关的几个疑问
缓存一致性问题参考下图,同一块主内存区域的值在处理器中多个处理单元处理了,都同时写入的时候,就需要决定是以谁的值为准,这个问题就是缓存一致性问题解决办法就是定义一套协议来处理,JVM中也有类似的协议来处理主内存与工作内存之间缓存一致性问题。处理器、高速缓存、主内存间的交互关系线程、主内存、工作内存三者的交互关系JVM缓存一致性问题解决协议?Java内原创 2017-02-17 09:30:57 · 462 阅读 · 2 评论 -
Java集合框架之fastutil
http://rensanning.iteye.com/blog/1548162fastutil扩展了 Java集合框架,通过提供特定类型的map、set、list和queue,以及小内存占用、快速访问和插入;也提供大(64位)array、set 和 list,以及快速、实用的 二进制文件和文本文件的I/O类。它是自由软件,依照Apache许可证2.0发布,需要Java 6或更高版本。转载 2016-08-09 21:24:09 · 5055 阅读 · 1 评论 -
log4j.properties配置详解
Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。1. 配置文件Log4J配置文件的基本格式如下:#配置根Loggerlog4j.rootLogger = [ level ] , appenderName1 ,转载 2016-05-23 10:59:45 · 456 阅读 · 0 评论 -
ReentrantReadWriteLock读写锁的使用
ReentrantReadWriteLock读写锁的使用 Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象。两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象。 读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读转载 2015-12-11 10:18:46 · 337 阅读 · 0 评论 -
Java中的Object的Wait() 和notify()方法使用时应注意的地方
Wait()和notify():如果条件不满足,则等待。当条件满足时,等待该条件的线程将被唤醒。一般用在synchronized机制中。例如:线程A synchronized(obj) { while(!condition) { obj.wait();转载 2015-12-10 14:12:52 · 1597 阅读 · 0 评论 -
ActiveMQ 即时通讯服务 浅析
1.下载ActiveMQ去官方网站下载:http://activemq.apache.org/2.运行ActiveMQ解压缩apache-activemq-5.5.1-bin.zip,然后双击apache-activemq-5.5.1\bin\activemq.bat运行ActiveMQ程序。启动ActiveMQ以后,登陆:http://localhost:8161转载 2015-11-12 12:56:41 · 456 阅读 · 0 评论 -
Ant path 匹配原则
转自:http://www.blogjava.net/supercrsky/articles/293728.htmlAnt path 匹配原则路径匹配原则(Path Matching) Spring MVC中的路径匹配要比标准的web.xml要灵活的多。默认的策略实现了 org.springframework.util.AntPathMatcher,就像名字提示的那样,路径模式转载 2015-06-12 15:35:07 · 539 阅读 · 0 评论 -
JAR命令使用
http://blog.sina.com.cn/s/blog_5da93c8f010108bt.htmlJAR包是Java中所特有一种压缩文档,其实大家就可以把它理解为.zip包。当然也是有区别的,JAR包中有一个META-INF\MANIFEST.MF文件,当你找成JAR包时,它会自动生成。JAR包是由JDK安装目录\bin\jar.exe命令生成的,当我们安装好JDK,设置转载 2015-06-25 20:38:15 · 340 阅读 · 0 评论 -
spring security原理讲解(1)
先来谈一谈Acegi的基础知识,Acegi的架构比较复杂,但是我希望我下面的只言片语能够把它说清楚。大家都知道,如果要对Web资源进行保护,最好的办法莫过于Filter,要想对方法调用进行保护,最好的办法莫过于AOP。Acegi对Web资源的保护,就是靠Filter实现的。如下图: 一般来说,我们的Filter都是配置在web.xml中,但是Acegi不一样,它在web.xml中配置的只是转载 2015-06-04 18:28:56 · 987 阅读 · 0 评论 -
spring security自定义过滤器
转载:http://blog.csdn.net/u012367513/article/details/38866465spring security使用分类:如何使用spring security,相信百度过的都知道,总共有四种用法,从简到深为:1、不用数据库,全部数据写在配置文件,这个也是官方文档里面的demo;2、使用数据库,根据spring security默认实现代码设计数据库,也转载 2015-06-04 18:52:22 · 14594 阅读 · 2 评论 -
Java学习之路
http://my.oschina.net/flynewton/blog/7770第一阶段 熟悉语言 在这个阶段,你是这个领域绝对的新手,你什么都不懂,什么都不知道,没有别的办法,看书,写代码,请教大牛。 在这个阶段你需要深入了解Java语言的语法,能够用它来做一些小东西,比如闹钟之类。并且随着你的学习深入,对自己未来的学习方向做出选择,SE,EE,ME?选择好自转载 2015-03-28 22:04:40 · 314 阅读 · 0 评论 -
Building For Different Environments with Maven
思路一——向MAVEN中传递参数,通过参数实现插件的不同行为操作 maven-antrun-plugin test run file="${pr原创 2015-12-01 15:45:31 · 342 阅读 · 0 评论 -
JAVA虚拟机内存回收算法与调优参数
原文:http://blog.chinaunix.net/uid-540802-id-1746443.html一、相关概念基本回收算法引用计数(Reference Counting)比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题转载 2015-12-03 16:37:15 · 706 阅读 · 0 评论 -
Spring AOP 实现机制
(1)AOP的各种实现在编译器修改源代码、在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码。以下是各种实现机制的比较: 类别分为静态AOP(包括静态织入)和动态AOP(包括动态代理、动态字节码生成、自定义类加载器、字节码转换)。静态织入:a、原理:在编译期,切面直接以字节码形式编译到目标字节码文件中 ;b、优点:对系统性能无影响;转载 2016-04-25 07:31:38 · 485 阅读 · 1 评论 -
使用IBM heapAnalyzer分析内存泄露的原因
大家在开发J2EE应用时可能经常碰到OOM的问题。出现这种问题的原因就是内存消耗殆尽,创建新的对象时没有可分配的内存了。为了找到真正导致OOM的原因,这里将使用IBM heapAnalyzer工具进行定位。首先要知道,IBM heapAnalyzer是通过分析OOM后的Java heap dump文件的,通过对dump文件的分析找到内存可能泄露的点。了解这个之后,我们首先需要生成dum转载 2016-04-26 15:33:34 · 10235 阅读 · 0 评论 -
JVM参数设置、分析
JVM系列三:JVM参数设置、分析JVM系列二:GC策略&内存申请、对象衰老 不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是以个极为复杂的过程,由于各个程序具备不同的特点,如:web和GUI程转载 2016-05-13 09:39:44 · 396 阅读 · 0 评论 -
几本推荐的Java书
一、《深入理解Java虚拟机:JVM高级特性与最佳实践》如果你不满足于做一个只会写if…else…的Java程序员,而是希望更进一步,我随便举几个例子吧:1、了解Java代码的底层运行机制2、定位性能问题3、对整个系统进行性能调优4、解决各种奇奇怪怪的线上线下问题5、更加高级别的,为自己的项目量身定做一款适合自己项目的虚拟机那 么Ja转载 2016-04-28 15:26:53 · 14930 阅读 · 3 评论 -
Java的SPI机制与简单的示例
http://www.tuicool.com/articles/rINr2m一、SPI 机制这里先说下SPI的一个概念,SPI英文为Service Provider Interface单从字面可以理解为Service提供者接口,正如从SPI的名字去理解SPI就是Service提供者接口;我对SPI的定义:提供给服务提供厂商与扩展框架功能的开发者使用的接口。在我们日常开发转载 2016-04-10 14:11:41 · 380 阅读 · 0 评论 -
Netty系列之Netty高性能之道
1. 背景1.1. 惊人的性能数据最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用。相比于传统基于Java序列化+BIO(同步阻塞IO)的通信框架,性能提升了8倍多。事实上,我对这个数据并不感到惊讶,根据我5年多的NIO编程经验,通过选择合适的NIO框架,加上高转载 2016-03-24 07:42:05 · 399 阅读 · 0 评论 -
Java泛型-类型擦除
一、概述 Java泛型在使用过程有诸多的问题,如不存在List.class, List不能赋值给List(不可协变),奇怪的ClassCastException等。 正确的使用Java泛型需要深入的了解Java的一些概念,如协变,桥接方法,以及这篇笔记记录的类型擦除。Java泛型的处理几乎都在编译器中进行,编译器生成的bytecode是不包涵泛型信息的,泛型类型信息将在编译处理是被擦转载 2015-12-08 16:29:39 · 333 阅读 · 0 评论 -
查看java内存情况命令
jinfo:可以输出并修改运行时的java 进程的opts。 jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。 jmap:打印出某个java进程(使用pid)内存内的所有'对象'的情况(如:产生那些对象,及其数量转载 2015-12-03 16:20:01 · 309 阅读 · 0 评论 -
spring IOC的理解
http://www.cnblogs.com/alaskan/p/4185111.html逛技术论坛的时候,不知道是一位刚学Java的新手,或者是一个工作了好几年没有使用过spring框架的开发者在论坛提出了这样一个问题:spring中的IOC有什么好的?想来这个问题这个大家心里都会立即说出IOC是spring的核心思想,叫控制反转也叫依赖注入。我在后续的回复里看到了太多的IOC其实就转载 2015-03-11 15:42:05 · 388 阅读 · 0 评论