- 浏览: 31468 次
- 性别:
- 来自: 杭州
最新评论
-
xussen:
zhenglu119 写道闭锁的实现主要基于AQS的实现,简单 ...
闭锁(CountDownLatch)源码 -
zhenglu119:
闭锁的实现主要基于AQS的实现,简单的使用AQS的state设 ...
闭锁(CountDownLatch)源码
文章列表
ConcurrentHashMap
主要两个结构:Segment[] 和 HashEntry[]
每个Segment是一个ReentrantLock
Segment结构跟HashMap差不多,成员:table,count,loadFactor,threshold,modCount
每个Segment继承ReentrantLock,实现Serializable
定义了一般的map方法,get,put ...
transient 为何不直接实例化这个数组,原因是不希望将数组中空余的也实例化,所以要加writeObject(ObjectOutputStream) readObject(ObjectInputStream)
ensureCapacity(size+1) //检查如果size+1大于oldCapacity,newCapacity=(oldCapacity*3)/2+1
fastRemove arrayList的remove方法利用System.arrayCopy方式进行移位,将删除的节点坐标后面的所有元素从前一位开始copy(覆盖),然后将最后一位为null
Map接口定义了一个内部类Entry
HashMap
一个bucket用Entry(extends Map.Entry)链表示
HashMap可以存放null key和null value
transfer 将当前tables上的所有的节点转移到newTable上去
hash(int hashCode) 是为了防止质量差的hash函数带来过多的冲突(碰撞)。
modCount 结构被改变的次数
putAll(Map) 会调用put方法
putForNullKey hashMap会将key为null的元素放到table[0]
containsValue 比较耗时,要遍历 ...
加载WebXmlConfiguration对象,找到webdefault.xml(在jetty-webapp-9.1.jar包中)和web.xml文件,创建WebAppClassLoader,利用StandardDescriptorProcessor解析WebXmlConfiguration,将配置信息设置到Context。执行子handler的start,会分别启动SessionHandler,SecurityHandler,ServletHandler (这三个Handler是在WebAppContext构造函数里初始化,并且排好顺序)比如SessionHandler启动的时候会创建并启动 ...
前言:tomcat启动(BootStrap),会由Server(LifeCycle)的start调用传递到StandardContext(LifeCycle)容器的start调用。
1、init初始化方法:加入ContextConfig listener,然后lifeCycleSupport.fireLifecycleEvent(INIT_EVENT),会触发ContextConfig的init方法,找到conf/context.xml和Catalina/localhsot/context.xml.default解析并将配置元素设置到context
2、lifeCycleSupport.f ...
三大组件:Bean,Context,Core
通过这三大组件能构建出像AOP,Web,Transaction,Orm特性功能
Bean组件的主要部分是BeanFactory、BeanDefinition、BeanDefinitionReader
1、BeanFactory分为ListableBeanFactory表示可以返回一些Bean集合,HierarchicalBeanFactory使得Spring具有了父子级联的IOC容器,AutowireCapableBeanFactory设置Bean里面的autowire自动装配值,比如autowireBean(Object bean)
功 ...
大对象直接进入老年代
大对象就是指需要大量连续空间的java对象,写程序时应该避免“短命的大对象”
可根据-XX:PretenureSizeThreshold来设置多大的对象直接进入老年代,但这东西只对Serial和ParNew收集器有效
长期存活的对象进入老年代
虚拟机为每个对象定义一个年龄计数器
在第一次Minor GC后仍然存活, 将对象移入Survivor空间年龄设为1。
今后每执行一次Minor GC,年龄加1。加到一定程度(-XX:MaxTenuringThreshold 默认15),晋升到老年代。
VM : -verbose:gc - Xms20M -Xmx20M -Xmn10M ...
1. 类型
支持的类型 数据模型实现 模型接口 操作 注意
标量
字符串 SimpleScalar TemplateScalarModel "Hello ${user}!",name[0] ,
r"${"test"}" Actually,the name of this interface should be TemplateStringModel
数字 SimpleNumber TemplateNumberModel ${1+1}
${x?string.currency}
${x?string("0.### ...
Garbage Collection
垃圾收集需要完成的三件事
1、哪些内存需要回收
2、什么时候回收
3、如何回收
java内存运行时区域的部分中,程序计数器,虚拟机栈,本地方法栈三个区域随线程而生而灭,栈中的栈侦随方法的进出而有条不紊的执行出栈入栈操作。每个栈中分配多少内存基本上在类结构确定下来时就已知的,因此,这些部分是内存分配和回收都具确定性。
java堆和方法区不一样。一接口实现,一方法的分支等需要的内存可能不一样,我们只有在运行时才知道要创建哪些对象,这部分都是动态的,GC关注的就是这部分内存.
判断对象已死
1、引用计数算法
引用计数的实现简单,效率也高,但是java没有采用 ...
这玩意儿不是线程安全的,看起来就是个包装器工具(SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String strDate = sdf.format(date);),但其实是把date的time值给注进去了,就是有状态了
为什么说公平锁的性能比非公平锁的性能低
在没有深入了解内部机制及实现之前,先了解下为什么会存在公平锁和非公平锁。公平锁保证一个阻塞的线程最终能够获得锁,因为是有序的,所以总是可以按照请求的顺序获得锁。不公平锁意味着后请求锁的线程可能在其前面排列的休眠线程恢复前拿到锁,这样就有可能提高并发的性能。这是因为通常情况下挂起的线程重新开始与它真正开始运行,二者之间会产生严重的延时。因此非公平锁就可以利用这段时间完成操作。这是非公平锁在某些时候比公平锁性能要好的原因之一。
首先要知道什么叫CAS(compare and swap):在jdk里面可以由UnSafe提供一个针对于volatile变量的操作,其原理是直接调用的CPU的CAS动作
举个例子:
我们经常会有这样的操作
if(a==b)
a = b+1;
在多线程的环境下,如果在执行完a==b之后,a发生了改变,我们就达不到预期的结果了
所以,就有了cas操作
具体你可以看看JDK的AtomicInteger,就提供了这样的cas操作compareAndSet
有了CAS,对于程序而言还不够
因为compareAndSet只是做一个尝试,如果失败了怎么办?我们还是想要做到a=b+1的结果 ...