pingh14

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  多线程

摘要:http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html http://www.crazyant.net/1858.html http://www.cnblogs.com/magialmoon/p/concur 阅读全文
posted @ 2018-01-31 16:25 pingh14 阅读(199) 评论(0) 推荐(0)

摘要:阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变... 阅读全文
posted @ 2014-05-27 23:31 pingh14 阅读(288) 评论(0) 推荐(0)

摘要:生产者消费者并发编程:假设仓库有10个仓位,分别有10个生产者和10个消费者,生产者不断生产产品,放入仓库的仓位中,而消费者则不断从仓库中获取产品,如果仓库已满,则生产者要等待,等消费者消费后,空出仓位后,再继续放入产品。反之如果仓库已空,则消费者要等待,等待生产者生产出产品后,再继续消费产品。关于... 阅读全文
posted @ 2014-05-18 15:34 pingh14 阅读(435) 评论(0) 推荐(0)

摘要:题目:http://wenku.baidu.com/view/d66187aad1f34693daef3e8a.html启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC....本文分别使用wait、nofity和Semaphore来实现:wait、nofity版本public class TestThread { public static void main(String[] args) { new Thread(new OrderThread(0,'A')).start(); new Thread(new OrderThrea... 阅读全文
posted @ 2014-02-28 15:13 pingh14 阅读(689) 评论(0) 推荐(0)

摘要:Java 语言中的 volatile 变量可以被看作是一种 “轻量级的synchronized”;与synchronized块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是synchronized的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。锁提供了两种主要特性:互斥(mutual exclusion)和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加 阅读全文
posted @ 2014-01-07 00:01 pingh14 阅读(443) 评论(0) 推荐(0)

摘要:合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性,如果线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。第四:提供定时执行、定期执行、单线程、并发数控制等功能。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。Java里面线程池的顶级接口是Executor,但是严格意义上讲Execu 阅读全文
posted @ 2014-01-06 02:05 pingh14 阅读(611) 评论(0) 推荐(0)

摘要:CountDownLatch的介绍和使用:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达0之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。使用场景:在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。 这个时候就可以使用CountDo 阅读全文
posted @ 2014-01-06 00:24 pingh14 阅读(1492) 评论(2) 推荐(0)

摘要:乐观锁 每次操作时不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止悲观锁 是会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。乐观锁可以使用volatile+CAS原语实现,读取内存值的方式实现了乐观锁,方法:第一,比较内存值和期望值;第二,替换内存值为要替换值。悲观锁可以使用synchronize的以及Lock。CAS是单词compare and set的缩写,意思是指在set之前先比较该值有没有变化,只有在没变的情况下才对其赋值。例如AtomicInteger的incrementAndGet的实现就用到了compareAndSet(CAS),如下代码所示 阅读全文
posted @ 2014-01-04 23:16 pingh14 阅读(1016) 评论(0) 推荐(0)

摘要:摘要从使用场景的角度出发来介绍对ReentrantLock的使用,相对来说容易理解一些。场景1:如果已加锁,则不再重复加锁a、忽略重复加锁。b、用在界面交互时点击执行较长时间请求操作时,防止多次点击导致后台重复执行(忽略重复触发)。以上两种情况多用于进行非重要任务防止重复执行,(如:清除无用临时文件,检查某些资源的可用性,数据备份操作等)if (lock.tryLock()) { //如果已经被lock,则立即返回false不会等待,达到忽略操作的效果 try { //操作 } finally { lock.unlock(); }}场景2:如果发现该操作已... 阅读全文
posted @ 2014-01-03 23:36 pingh14 阅读(2223) 评论(0) 推荐(0)

摘要:Semaphore:动态增减信号量,用于控制对某资源访问的同一时间的并发量。类似于令牌,谁拿到令牌(acquire)就可以去执行了,如果没有令牌则需要等待。【如何获取】:semaphore.tryAcquire(),尝试获取,不阻塞。semaphore.acquire(),没信号量可用时,将进行阻塞等,可以被中断。acquireUninterruptibly():获取信号量,将进行阻塞,但会忽略线程的中断而且不会抛出任何异常。【如何释放】:semaphore.release();线程抛出各种异常,都别忘了在finally中释放信号量;如果释放的比获取的信号量还多,例如获取了2个,释放了5次,那 阅读全文
posted @ 2014-01-02 22:27 pingh14 阅读(680) 评论(0) 推荐(0)

摘要:d 阅读全文
posted @ 2013-12-24 00:40 pingh14 阅读(160) 评论(0) 推荐(0)