随笔分类 -  多线程

摘要:JDK1.5引入了Doug Lea大神的concurrent框架,其中AbstractQueuedSynchronizer是concurrent框架的基本,从大神的paper中可以看到1.传统的synchronized不能进行中段,这个不合适2.如果将concurrent重心放在少数竞争下优化锁,而在其他情况下放任缓慢执行的策略是不正确的3.需要可预测的维护效率,即使在同步竞争激烈的情况下,理想中无论多少线程试图通过一个同步点的开销应该是恒定的4.设计的目标是总时间的减少,因为有可能在此之间一个线程可以通过同步点,然后他没有立即执行5.在高吞吐量的基本上,更重要的是线程的公平调度AQS设计思路 阅读全文
posted @ 2012-07-23 19:35 nod0620 阅读(2051) 评论(0) 推荐(2)
摘要:concurrent包里面有很多Lock的具体实现,其具体的实现都是基于AQS实现的ReentrantLockReentrantLock是可重入的互斥锁,重点是重入和互斥,ReentrantLock 将由最近成功获得锁的线程所持有,当这个线程再次尝试拥有这个Lock时就是重入。互斥就是在某一时间只有一个线程能持有Lock。 public void lock() { sync.lock(); }获得锁方法,Sync是AQS的抽象子类,实现可重入和互斥的大部分功能。在Sync的子类中有FairSync和NonfairSync两种代表公平锁策略和非公平锁策略Sync lock方法留给子类去实现,No 阅读全文
posted @ 2012-07-23 19:33 nod0620 阅读(745) 评论(0) 推荐(0)
摘要:图左边是线程池的类结构,右边是放入线程池执行的任务类结构ExecutorServiceExecutorService定义了线程池的基本的方法,AbstractExecutorService是个抽象类,实现了ExecutorService的部分,主要是实现了几个submit()方法,并且提供方法将提交进来的任务封装成FutureTask,ThreadPoolExecutor则实现线程池的管理.FutureTaskFutureTask内部引用了一个AQS的实现,当FutureTask没有执行完毕的时候,FutureTask的get()方法所在线程阻塞在AQS阻塞队列上,所以get()方法可以认为是 阅读全文
posted @ 2012-07-17 15:03 nod0620 阅读(1542) 评论(0) 推荐(0)
摘要:首先说下线程的死锁,个人想法(从艺术家吃饭说起): 1.必须有资源想被多个线程独占,但是资源不能共享,也就是一次只能一个线程用 2.一个线程抢占一个资源然后再等待另外一个线程(大家都这样) 3.资源不能被强占,大家都是优先级相同的线程,都在那里等 4.发生循环等待了(多个锁)避免死锁就是打破上面任何一条 一个并发程序好坏大致需要两个方面:响应速度和伸缩性,也即是有多快和有多少,这往往是相互矛盾的两方面,我们需要做的就是平衡这两方面。 从并发程序的特点看,我们可以从以下几方面入手性能的优化: 1 多线程执行那么必须在多个线程里面上下切换,这需要操作系统保存上个线程的多线程,创建或者唤醒下个线程, 阅读全文
posted @ 2012-07-16 13:49 nod0620 阅读(349) 评论(0) 推荐(0)
摘要:single thread executionsingle thread execution主要思想是:在同一时刻,对于某一共享资源,只能有一个人访问,即资源同步。package gate;public class Person { private String name; private String address; public synchronized void setNameAddress(String name,String address){ this.name = name; this.address = address;... 阅读全文
posted @ 2012-07-16 13:40 nod0620 阅读(828) 评论(0) 推荐(0)