- 浏览: 241794 次
- 性别:
- 来自: 南京
最新评论
-
phplife:
写的很棒,对我很有帮助,thx!
Erlang OTP学习(1):gen_server -
longshaohang:
写的不错,不过最后markLimit的讨论太少,我的理解是bu ...
BufferedInputStream实现原理分析 -
lin_464025910:
Erlang 很牛逼的 开发语言, 最近才关注 性能确实 不 ...
Erlang 文件处理(读书笔记) -
jaychang:
写的很不错MARK下
BufferedInputStream实现原理分析 -
vavi:
while (count == items.length) ...
Java锁相关总结
文章列表
前言
平时经常使用HashMap,也大致了解它的数据结构,但是一直没有一窥究竟,今天正好有时间看了下源码(确实有很多自己不懂以及可学习的地方),现在简单做些笔记
1.HashMap的数据结构
上图大致描绘了HashMap的数据结构,其基本算法如下:
当我们把一个元素a放入HashMap时,首先获取a的hashCode,然后通过hash算法得到哈希值k,最后把k散列到数组位置i上,如果该位置为空则直接插入,否则遍历这个位置上的链表(若找到相同的节点(equals方法)则更新节点,否则插入)
2.HashMap的构造方法(挑选两个重要的看):
public HashMap(int init ...
这段时间一直在做一个项目,由于涉及的代码分支比较多,每次搭建环境都非常麻烦,所以就尝试写一个shell脚本来减轻工作量(希望自己以后能通过这些一点点提高自己的shell水平)。
#!/bin/bash
################################
#
# 自动更新项目分支脚本
#
# 运行方式:sh tools.sh config
#
# diaocow 2012-07-29
#
#
################################
# mvn编译分支
function compile() {
local svn_d ...
常用命令总结(不断更新)
- 博客分类:
- Linux命令
快捷操作命令
1.查找最近输入命令中以某些字符开头的命令
Ctrl+Shift+R
2.跳到命令的最前端
Ctrl+A
3.跳到命令的末尾
Ctrl+E
4.删除当前光标之前所有字符(一般用来删除整条命令)
Ctrl+U
5.删除当前光标之前一个单词
Ctrl+W
6.清空屏幕输出(效果同clean命令)
Ctrl+L
7.暂停屏幕输出(配合tail -f看日志很方便)
Ctrl+S
8.继续屏幕输出(配合tail -f看日志很方便)
Ctrl+Q
文件操作命令
1.修改文件访问权限
chmod a+x test.vm
2.修改文件拥有者
chown a: ...
1.ReentrantLock对象
private ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
//代码段
}
finally {
lock.unlock(); // 这步至关重要,千万不能遗漏
}
a.一旦一个线程获得了锁对象,那么其他线程都将阻塞在lock.lock()方法中;
b.锁对象是可重入的(即已经获得锁的线程可以再次获得锁),这时候琐计数+1,当线程调用unlock方法时,琐计数-1,只有当琐计数为0时,才被释放;
c.ReentrantLock类还具有一个带有bo ...
今天重新看了一下Hessian的序列化类,发现了一个之前被自己忽略的地方,而这应该也是Hessian序列化较快的原因之一(参考源码3.0.13)。
在大多数序列化类开始之前都有这么一段代码:
if (out.addRef(obj))
return;
//省略具体序列化code...
我们看下addRef(obj)做了些什么?
从代码注视中,我们也能看出它的含义:如果当前对象已经被序列化,那么此次我们只序列化它的引用)
/**
* If the object has already been written, just write its ref.
...
分析了BasicSerializer和JavaSerializer,剩下的序列化类就比较简单了,其实最本质的是基本类型的序列化http://diaocow.iteye.com/blog/1317164,其他任何类型的序列化最后都可以回归到基本类型的序列化;
隐隐的感觉透着递归的理念,最后递归到一个基本问题的解决!
今天我们分析下CollectionSerializer和MapSerializer(参考源码版本3.0.13)。
1.CollectionSerializer
public void writeObject(Object obj, AbstractHessianOutput ...
紧接着上一篇,我们来看看另一个序列化类JavaSerializer(参考源码版本3.0.13)。
这个类一般是用来序列化我们自定义类的(DefaultSerializer),所以更多的时候我们用到的是它,今天打算分析两个方面:
1.JavaSerializer本身实现分析;
2.分析下反序列化的时候为什么会存在父类同名field覆盖子类field值问题;
JavaSerializer实现
// 首先看一下JavaSerializer的构造方法
public JavaSerializer(Class cl, ClassLoader loader)
{
...
// 存放简单类型字 ...
之前分析了序列化一个对象的流程,基本上可以归纳成先获取一个对象的序列化类,然后由该序列化类来序列化对象;那么究竟有哪些序列化类,以及这些类是如何序列化的就是我们本次分析的重点(参考源码版本3.0.13)!
先看下整个序列化类的的类图:
可以看出:
1.它们都是AbstractSerializer的子类;
2.实现序列化的方法是:void writeObject(Object obj, AbstractHessianOutput out)方法;
现在我们就分别讨论这些类的实现,首先是BasicSerializer类(用来序列化java基本类型,以及基本类型数组)
Integer ...
今天我们重点来看看Hessian是如何实现序列化的(这些序列化类可以脱离hessian源码包,单独拿出来使用),参考源码版本为3.0.13
首先我们看下序列化一个对象的代码:
// 这里可以是任何形式的OutputStream,现以FileOutputStream为例
OutputStream os = new FileOutputStream("hessianOutput");
// 创建 HessianOutput对象
AbstractHessianOutput out = new HessianOutput(os);
// 设置序列化工厂(其实上一步初 ...
【客户端】
我们在客户端是如何使用hessian呢?
String url = "http://localhost:8080/Hello/hello";
HessianProxyFactory factory = new HessianProxyFactory();
// IHello为调用的服务接口,url为hessian服务url
IHello helloProxy = (IHello)factory.create(IHello.class, url);
System.out.println(helloProxy.sayHello());
以 ...
【服务端】
HessianServlet 是一个非常普通的Servlet 它直接继承 GenericServlet
我们看其中两个核心方法:init与service方法(参考源码版本3.0.13)
init(ServletConfig config)
该方法覆写父类的init(ServletConfig config)方法(按照servlet规范推荐,覆写i ...