
java
文章平均质量分 63
v_ZSW
这个作者很懒,什么都没留下…
展开
-
动态代理
代理就像个中介,最外层操作代理对象,代理对象再调用委托对象当需要在调用前后做一些处理,但是这些处理与业务逻辑无关的时候,如果把无关代码写在业务逻辑里面,代码就会变得很乱,这时候用代理就再好不过了。就像spring的aop编程,也是用了代理,在调用前后做一些校验、日志记录等无关业务流程的事因为要通过代理对象去调用委托对象,所以代理对象需要持有委托对象的引用,而且代理类中需要实现委托对象...2016-07-14 00:26:39 · 108 阅读 · 0 评论 -
锁实现原理
本文从happens-before关系出发,结合ReentranLock源码,如何用内存屏障、CAS操作、LOCK指令实现锁的功能。原创 2017-12-25 20:57:59 · 2311 阅读 · 0 评论 -
Volatile实现原理
读写volatile变量就像是访问一个同步块一样,是原子的且是可见的,总是能访问到最新的值。其底层使用了Lock前缀和内存屏障保证可见性。原创 2017-12-25 11:16:25 · 1323 阅读 · 0 评论 -
内存屏障保证缓存一致性
缓存一致性协议给缓存行(通常为64字节)定义了个状态:独占(exclusive)、共享(share)、修改(modified)、失效(invalid),用来描述该缓存行是否被多处理器共享、是否修改。所以缓存一致性协议也称MESI。原创 2017-12-24 15:32:59 · 1507 阅读 · 0 评论 -
从源代码到Runtime发生的重排序
源代码和Runtime时执行的代码很可能不一样,这是因为编译器、处理器常常会为了追求性能而改变执行顺序。然而重排序很危险,很有可能使得运行结果和预想的不一样,特别是当重排序共享变量时。从源代码到Runtime需要经过三步的重排序:编译器重排序->指令重排序->内存系统重排序编译器重排序。原创 2017-12-22 15:49:03 · 395 阅读 · 0 评论 -
锁原理:偏向锁、轻量锁、重量锁
java中每个对象都可作为锁,锁有四种级别,按照量级从轻到重分为:无锁、偏向锁、轻量级锁、重量级锁。每个对象一开始都是无锁的,随着线程间争夺锁,越激烈,锁的级别越高,并且锁只能升级不能降级。原创 2017-12-18 16:15:16 · 12463 阅读 · 3 评论 -
Java内存模型—JMM
有时候编译器、处理器的优化会导致runtime与我们设想的不一样,为此Java对编译器和处理器做了一些限制,JAVA内存模型(JMM)将这些抽象出来,这样编写代码时就无需考虑那么多底层细节,并保证“只要遵循JMM的规则编写程序,其运行结果一定是正确的”。原创 2017-12-21 17:00:06 · 300 阅读 · 0 评论 -
jdk源码分析红黑树——插入篇
红黑树是自平衡的排序树,自平衡的优点是减少遍历的节点,所以效率会高。如果是非平衡的二叉树,当顺序或逆序插入的时候,查找动作很可能会遍历n个节点红黑树的规则很容易理解,但是维护这个规则难。一、规则1.每个节点要么是红色、要么是黑色2.根节点一定是黑色3.红色节点不可以连续出现(父节点、子节点不可同时为红)4.从任意节点出发,到树底的所有路线,途径的黑节点数量必须相同在修改原创 2016-11-01 18:00:27 · 489 阅读 · 0 评论 -
jdk源码分析PriorityQueue
一、结构PriorityQueue是一个堆,任意节点都是以它为根节点的子树中的最小节点堆的逻辑结构是完全二叉树状的,存储结构是用数组去存储的,随机访问性好。最小堆的根元素是最小的,最大堆的根元素是最大的这是一个最小堆的逻辑结构这是他的存储结构,是用数组来存储的。可以看到,i下标的数组元素,他的父节点是(i-1)/2,他的左右节点分别是i*2+1,i*2+原创 2016-10-31 16:09:18 · 401 阅读 · 0 评论 -
jdk源码分析ArrayDeque
ArrayDeque数组循环队列,这个数据结构设计的挺有意思的。据说此类很可能在用作堆栈时快于 Stack,在用作队列时快于 LinkedList。一、容量1.1默认容量是8=2^31.2指定初始化容容量 public ArrayDeque(int numElements) { allocateElements(numElements);原创 2016-10-27 19:46:56 · 461 阅读 · 0 评论 -
简单的Writer和Reader
Writer用于写出去到文件中,Reader用于将外面的文件读进来控制台 Writer和Reader有许多子类,但是子类大多都是直接运用父类Writer和Reader的方法,而且Writer和Reader的方法不多,而且有共性,所以只需弄懂Writer和Reader的方法即可。 Writer和Reader都是抽象类,所以想输入输出只能用他们的子类WriterWriter的主要方法1.构造方法原创 2015-11-28 13:54:51 · 1954 阅读 · 0 评论 -
初识字节流+实现缓冲字节流
java中的IO流可以分为两种:字符流和字节流 字符流,顾名思义,就是对字符进行操作,只能操作文本文件 字节流,就是对字节进行操作,然而文件都是由字节组成的,可以字节流可以操作一切文件 字符流中的两个大类:Reader和Writer 详情可见 http://blog.youkuaiyun.com/noble510520/article/details/50083555 简单的Writer和Reader原创 2015-11-28 18:56:53 · 452 阅读 · 0 评论 -
java.io.StreamCorruptedException: invalid type code: AC错误的解决方法
问题描述:在向一个文件写入可序列化对象时,每次只想向文件的末尾添加一个可序列化的对象,于是使用了FileOutputStream(文件名,true)间接的构建了ObjectOutputStream流对象,在向外读数据的时候第一次运行的时候不会报错,在第二次就会报java.io.StreamCorruptedException: invalid type code: AC错误。原因:在一个文件都有一个转载 2015-12-14 21:10:16 · 1890 阅读 · 0 评论 -
当输入流和输出流同时作用一个文件
当输入流和输出流同时作用一个文件会发生什么 以前试过:当输入流或输出流作用在一个文件上,而且流没有关闭的话,这时候我想删除这个文件是失败的,会提示文件被占用下面用代码证明一下import java.io.*;class Demo{ public static void main(String[] args)throws IOException{ File file=new原创 2015-12-14 23:43:53 · 1965 阅读 · 0 评论 -
NotSerializableException解决方法
NotSerializableException问题描述: 想要写入对象的时候的时候回抛出NotSerializableException:类名原因: 写入的对象没有序列化,即没有实现java.io.Serializable接口解决方法: 将要被写出对象的类序列化,可以不设置序列号,这时由系统自动设置,也可以自己设置序列号 设置方法: private static final long se原创 2015-12-14 23:18:38 · 39450 阅读 · 0 评论 -
java1.8的默认方法的坑
默认方法: 接口的方法一直都是抽象方法,自从1.8出来了之后,新增了一个默认方法。可以在接口中实现方法 1.默认方法需要用default修饰 2.默认方法不能是静态的 3.子接口继承了2个相同签名的默认方法,需要自己覆写指定一个默认方法,不然就挂 4.子接口不能重写默认方法,只有实现类可以,而且重写的时候必须Public原创 2015-12-14 19:36:27 · 537 阅读 · 0 评论 -
初学File类
今天刚开始学了File类一开始看思想编程看得迷迷糊糊的,之后受不了了,直接去看API文档归纳: File->java.util`File->java.util File类的主要方法:构造方法: File(String pathname) File(String parent,String child) 顾名思义 parent\child File(File parent,String原创 2015-11-23 17:29:37 · 326 阅读 · 0 评论 -
在Java中如何实现“Pless presss any key to continue.”
import java.util.*;class Continue{ public static void main(String[] args){ Scanner scanner=new Scanner(System.in); System.out.println("Pless presss any key to continue.");原创 2015-11-23 23:39:05 · 1226 阅读 · 1 评论 -
递归思想解决输出目录下的全部文件
刚刚了解了下递归思想递归就是在方法内调用本方法下面说一个实际的应用 输出目录下的全部文件,当目录中还有目录时,则进入目录输出里面的文件import java.io.*;class ShowFile{ public static void showfile(File files){ if(files.isDirectory()){ File[] li原创 2015-11-23 23:30:12 · 514 阅读 · 0 评论 -
Properties+重温Map+本地计数器
昨天想写一个记账本,发现并不能把项目名称与内容关联起来,于是乎我想到了map,可是又不知道map储存到文件中又怎么读出来,幸好今天遇到了properties Properties是Hashtable的子类,Hashtable实现Map接口 所以Properties其实是一个MapMap(映射)首先Map是一个接口,所以实例化找他的子类HashMap、LinkedHashMap和TreeMap原创 2015-11-30 15:10:05 · 433 阅读 · 0 评论 -
模拟Executor策略的实现
Executor作为现在线程的一个管理工具,就像管理线程的管理器一样,不用像以前一样,通过start来开启线程 Executor将提交线程与执行线程分离开来,使得用户只需要提交线程,并不需要在乎怎么和什么时候开启线程需要有以下功能: 1.查看现在开启了哪些进程 2.查看还有哪些进程未执行 3.查看现在开启线程的数量 4.查看还有多少线程未开启 5.设置执行顺序(先提交先执行,先提交后执行原创 2015-12-30 23:35:39 · 434 阅读 · 0 评论 -
jdk顺序表笔记
一、AbstractCollection提供了集合的最大实现继承该类,必须实现size()和iterator(),因为该类操作集合都是通过iterator二、fail-fast策略该策略在集合框架中多次被应用一种多线程对同一集合操作的保护措施,确保操作目标没有被其他线程操作过,与cas思想有异曲同工之处具体在集合中的实现:定义一个全局变量modCount,表示集合被修改原创 2016-10-26 13:49:01 · 353 阅读 · 0 评论 -
jdk链表笔记
一、LinkedListLinkedList是双链表,并且有头尾指针1.随机访问的优化node(index)该方法用于获取根据下标获取节点,亮点在于,先判断index是size的前半段还是后半段,来决定是用头节点遍历还是为节点来遍历2.要有解除引用的习惯unlinkFirst、unlinkLast、unlink、clear,这种删除节点的方法,都会把该节点的所有引用以及其他对象原创 2016-10-26 16:07:11 · 581 阅读 · 0 评论 -
jvm内存溢出分析
概述jvm中除了程序计数器,其他的区域都有可能会发生内存溢出内存溢出是什么?当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出内存溢出和内存泄漏有什么区别?内存泄漏是由于使用不当,把一部分内存“丢掉了”,导致这部分内存不可用。 当在堆中创建了对象,后来没有使用这个对象了,又没有把整个对象的相关引用设为null。此时垃圾收集器会认为这个对象是需原创 2016-11-07 13:43:23 · 404 阅读 · 0 评论 -
jvm内存区域
概述jvm内存分为几个区域: - 程序计数器 - 虚拟机栈 - 本地方法栈 - 堆 - 方法区 - 运行时常量池 - 直接内存 这些内存区域是在java进程中细分的,为java程序提供服务 不同的区域存储的内容不一样,生命周期的也不一样内存区域程序计数器这个就跟处理器中的程序计数器的功能差不多,是记录下一条字节码的地址 不过处理器的程序计数器是为进程服务的,jvm中的程序计数器是原创 2016-11-05 15:12:40 · 305 阅读 · 0 评论 -
SpringMVC类型转换器、属性编辑器
对于MVC框架,参数绑定一直觉得是很神奇很方便的一个东西,在参数绑定的过程中利用了属性编辑器、类型转换器参数绑定流程参数绑定:把请求中的数据,转化成指定类型的对象,交给处理请求的方法 请求进入到DisptacherServlet,卸下请求中的数据 DisptacherServlet将请求中的数据发送给Controller 获取Controller需要接收的参数原创 2016-07-16 17:03:13 · 640 阅读 · 0 评论 -
代理
代理就像个中介,最外层操作代理对象,代理对象再调用委托对象当需要在调用前后做一些处理,但是这些处理与业务逻辑无关的时候,如果把无关代码写在业务逻辑里面,代码就会变得很乱,这时候用代理就再好不过了。就像spring的aop编程,也是用了代理,在调用前后做一些校验、日志记录等无关业务流程的事因为要通过代理对象去调用委托对象,所以代理对象需要持有委托对象的引用,而且代理类中需要实现委托对象的原创 2016-07-13 16:44:21 · 328 阅读 · 0 评论 -
IO碰到的问题
1.流关了,并不代表流对象为空 可是java并没提供查看流是否关闭的方法 2.每一次操作最好不要实时保存,避免flush()太多次,最后只能read最后一个对象了,导致EOFException原创 2015-12-15 21:27:41 · 405 阅读 · 0 评论 -
怎么实现关闭窗口
思路:在java源文件中查找源代码 首先,我们知道JFrame.setDefaultCloseOperation(int operation)中提供了四种方式去实现关闭窗口 JFrame在包javax.Swing中,所以他继承了java.awt.FramesetDefaultCloseOperation(int operation)下面贴上 JFrame.setDefaultCloseOpera原创 2015-12-04 10:25:48 · 756 阅读 · 0 评论 -
SequenceInputStream
SequenceInputStream从名字上看, 他是一个序列字节输入流 既然是个序列 那么意味着 SequenceInputStream装着许多的输入流 所以 可以用他来合并文件SequenceInputStream的主要方法SequenceInputStream构造方法new SequenceInputStream(Enumeration) 接受一个输入流泛型的枚举然后怎么创建枚举呢原创 2015-12-03 17:22:16 · 451 阅读 · 0 评论 -
怎么改变按钮的图标
按钮的图标一开始很难看 所以要改改变按钮图标的方法: javax.swing.AbstractButton中的方法 setContentAreaFilled(boolean) //是否填充区域,如果你的自定义图片不是矩形或存在空白边距,可以设为 false 使按钮看起来透明。 setBorderPainted(boolean) //是否绘制边框 setFocusPainted(bool转载 2015-12-09 13:23:18 · 1060 阅读 · 0 评论