- 浏览: 31467 次
- 性别:
- 来自: 杭州
最新评论
-
xussen:
zhenglu119 写道闭锁的实现主要基于AQS的实现,简单 ...
闭锁(CountDownLatch)源码 -
zhenglu119:
闭锁的实现主要基于AQS的实现,简单的使用AQS的state设 ...
闭锁(CountDownLatch)源码
文章列表
Eagerly check singleton cache for manually registered singletons
check if bean definition exists in this factory
Not fond ->check parent factory
Guarantee initialization of beans that the current bean depends on.//保证当前bean所依赖的bean必须初始化完成
getBean(dependsOnBean)
if the current bean is singl ...
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
public class MySimpleReadWriteLock {
private Syn syn = new Syn();
private Lock readLock = new ReadLo ...
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
public class MySimpleLock {
private Syn syn = new Syn();
private static class Syn extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 1L;
@Override
protected boolean tryAcquire(int ...
DispatcherServlet配置到web.xml。在servlet.init()的时候进行spring mvc的初始化
1、创建springmvc的ioc容器并refresh(),从ServletContext中拿到Spring ioc容器并设置父子ApplicationContext关系
2、初始化Servlet需要用的策略工具
比如:初始化文件上传工具、国际化工具、HandlerMappings、HandlerAdapters、View解析器
从容器里拿出所有HandlerMapping设置到dispatcherServlet.handlerMappings
从容器里拿出所 ...
Spring Aop
- 博客分类:
- Spring
三种方式:ProxyFactoryBean,BeanNameAutoProxyCreator,基于标签或注解形式
1、ProxyFactoryBean
只能代理一个类
targetBean interceptorNames proxyInterfaces
它是一个FactoryBean,通过getObject来获取目标对象生成代理对象所用的工具是AopProxy.getPr ...
scope
singleton
prototype
request(每次请求创建一次bean)、session(每个会话创建一次bean)、globalSession、application(放到ServletContext里面,跟放到spring容器里面差不多)
SimpleThreadScope bean只存放进单个线程
自己定制可以用CustomScopeConfigurer。(BeanFactoryPostProcessor是在BeanDefinition创建完之后,Bean对象实例化之前执行的,可以在这个时候将Scope执行策略放进去)
入口:在web.xml里面配置ServletContextListener,在Servlet容器初始化完以后会执行ServletContextListener的contextInitialized(ServletContextEvent)。
创建XmlWebApplicationContext。(根据ContextLoader.properties里的配置创建)
对创建出来的上下文进行刷新context.refresh()。
创建DefaultListableBeanFactory,将它设置到Context里,作为后面创建bean的factory
为factory设置c ...
两个好处:
1、线程可以重复利用,不用对同步任务进行不断的创建销毁
2、可以限制和管理资源,如线程
两个结果组成:
Set workers 表示每个正在跑的线程,在run中,先是处理第一个Task,处理完后会从workQueue中尝试拿到一个Task进行处理,如果没有,结束(keepAliveTime可以调节结束的延时)、删除这个worker
BlockingQueue<Runnable> workQueue 表示poolSize快要超出corePoolSize的时候,将对象放到阻塞队列里面去。如果阻塞队列也放不进去,继续放入workSet集合里面,如果works ...
tryAcquireShared
exclusiveCount(state)!=0&&getExclusiveOwnerThread!=current//如果现在是写锁状态,并且当前线程不是拥有锁的线程
也就是如果是当前线程是拥有写锁的,读操作也可以进去
if(!readShouldBlock(current)&&CAS(state, state+SHARED_UNIT)){
cacheHoldCounter.count++ //重入计数
return 1;
}
return -1;
tryAcquire
if(state!=0) ...
阻塞lock的基本流程
if(cas(0,acquire))
setExclusiveOwnerThread
else if(current==getExclusiveOnwerThread) {
setState(c+acquires)
}
addWaiter
park
........................
for(;;) {
p = node.predecessor
if(p==head&&tryAcquire(arg)){
setHead(node)
return
}
park
}
阻 ...
成员:sync
方法:acquire acquire(int) acquireUnInterruptibly acquireUnInterruptily(int) tryAcquire tryAcquire(int) tryAcquire(long, TimeUnit) tryAcquire(int, long, TimeUnit)
release release(int)
availablePermits drainPermits isFair hasQueueThreads getQueueLength
内部类:Sync NonFairSync FairSync
...
成员:lock,trip(是lock的condition),parties,barrierCommand,generation,count
1、generation是为了标示这一次的栅栏是否被破坏。
2、parties就是构造函数时传入的参数,表示在trip之前需要执行的线程数。count被parties初始化,是一个变量,dowait时会减一,直至等于0的时候,触发nextGeneration(),里面执行了trip.signalAll(),count=parties,generation=new Generation()
3、barrierCommand在count减为0(tr ...
成员sync
所含方法: await(),await(long, TimeUnit),countDown,getCount
内部静态类Sync extends AbstractQueuedSynchronizer
1、两个公开方法,await和countDown,不存在获取资源的操作,在初始化的时候已经设置state。tryAcquireShared只是做检查操作,如果等于0,就返回1(表示获取成功)
countDown做releaseShared操作,一直release到state等于0,就会唤醒AQS里面的第一个Node,该Node获取资源又成功(因为tryAcquireSh ...
有head和tail
当acquire*操作的时候,如果我们定义的资源限制操作返回false时,会在tail端加入一个新的节点(Node里面的所有基础属性都是volatile,用CAS设置tail指针)。
然后利用LockSupport.part(this)阻塞。
当release的时候,如果我们定义的资源操作返回true,会将head节点的下一个SIGNAL节点的thread唤醒。
被唤醒的那个线程会继续尝试执行tryAcquire,这时候会和新线程的请求发生争用,ReentrantLock在这里做了两种策略,一种是判断当前线程是否在链表的第一个位置(fair),一种是不做判断直接 ...
成员:head tail
内部类:Node item和next,Itr implements Iterator
add offer
利用UNSAFE.compareAndSwapObject(p, nextOffSet, null, newNode)(p表示遍历整个链表一直到next为null为止的Node)
如果设置成功,调用UNSAFE.compareAndSwapObject(this, tailOffSet, cmp, newNode),如果设置失败也没关系,因为说明在上一步到这一步之间有其他线程添入了新的节点并且重新设置了tail
总结:使用CAS原子指令来处理 ...