随笔分类 -  并发相关

并行排序
摘要:排序是一项非常常用的操作,你的应用程序在运行时,可能无时无刻不在进行排序操作。排序的算法有很多,但是对于大部分的算法都是串行执行的。当排序的元素很多时,若使用并行算法代替串行,显然可以更加有效的利用CPU,提高排序效率。但将串行算法修改为并行算法并非易事,甚至会极大的增加原有算法的复杂度。下面介绍几 阅读全文

posted @ 2018-10-23 16:35 AoTuDeMan 阅读(2506) 评论(0) 推荐(0)

并行搜索
摘要:搜索是几乎每一个软件都必不可少的功能。对于有序数据,通常采用二分查找法。对于无序数据,则只能挨个查找。 给定一个数组,我们要查找满足条件的元素。对于串行程序来说,只要遍历一下数组就可以得到结果。但是如果要使用并行方式,则需要额外增加一些线程间的通信机制,使各个线程可以有效的运行。 一种简单的策略就是 阅读全文

posted @ 2018-10-19 17:00 AoTuDeMan 阅读(445) 评论(0) 推荐(0)

并行算法
摘要:并发算法虽然可以充分的发挥多核CPU的性能。但不幸的是,并非所有的计算都可以改造成并发的形式。简单来说,执行过程中有数据相关性的运算都是无法完美并行化的。 假如现在有两个数C和B,如果我们要计算(B+C)*B/2,那么这个运行过程就是无法并行的。原因是,如果B+C没有执行完成,则永远都算不出(B+C 阅读全文

posted @ 2018-10-19 15:08 AoTuDeMan 阅读(381) 评论(0) 推荐(0)

ThreadLocal
摘要:除了控制资源的访问外,我们还可以通过增加资源来保证所有对象的线程安全。比如,让100个人填写个人信息表,如果只有一支笔,大家就得挨个填,对于管理人员来说,必须保证大家不会去哄抢仅存的一支笔,否则,谁也填不完。当然我们还可以从另外一个角度出发,就是准备100支笔,人手一支,那么所有人都可以各自为营,很 阅读全文

posted @ 2018-10-16 16:13 AoTuDeMan 阅读(218) 评论(0) 推荐(0)

锁的优化以及Java虚拟机对锁优化所做的努力
摘要:锁的优化 在并发的程序应用中,锁的竞争必然导致程序的性能下降。为了将这种副作用降到最低,下面提出一些建议可以帮助大家写出性能更加优越的程序。 减少锁持有的时间 对于使用锁进行并发控制的应用程序而言,在锁竞争的过程中,单个线程对锁的持有时间与系统性能有着直接的关系。如果线程持有锁的时间很长,那么相对的 阅读全文

posted @ 2018-10-15 15:57 AoTuDeMan 阅读(147) 评论(0) 推荐(0)

CAS(Compare And Swap)
摘要:之前的文章讲了ReentrantLock和synchronized都是通过锁来保证线程安全的,锁机制存在一些问题,例如: ❤ 在多线程的竞争下,加锁、释放锁会导致很多线程的上下文切换和调度,对性能有一定的影响; ❤ 一个线程持有锁会导致其他需要此锁的线程挂起(强行在锁的区域将并行变为串行); ❤ 使 阅读全文

posted @ 2018-10-11 14:43 AoTuDeMan 阅读(326) 评论(0) 推荐(1)

线程池的堆栈问题
摘要:前面的文章已经讲了线程池和线程池的内部实现,这篇文章来了解线程池出错的堆栈信息的打印,毕竟异常堆栈信息的重要性对于程序员来说就像是指南针对于茫茫大海上的船只一样,没有指南针船只只能更加艰难的寻找方向,没有异常堆栈信息,排查问题时,也就只能像大海捞针一样,慢慢琢磨了。 看下面的例子: 上述代码是将Di 阅读全文

posted @ 2018-10-08 15:22 AoTuDeMan 阅读(569) 评论(0) 推荐(0)

线程池的内部实现
摘要:上一篇文章讲了线程池的基本用法和一些使用技巧,这篇文章就继续深入的了解线程池,看看常用的线程池的内部实现,话不多说,开始: 对于几个核心的线程池,无论是newFixedThreadPool(int nThreads),newSingleThreadExecutor()和newCacheedThrea 阅读全文

posted @ 2018-09-28 09:25 AoTuDeMan 阅读(564) 评论(0) 推荐(0)

线程池
摘要:多线程的软件设计方法确实可以最大限度的发挥现代多核处理器的计算能力,提高生产系统的吞吐量和性能。但是,若不加控制和管理的随意使用线程,对系统的性能反而会产生不利的影响。 首先,虽然与进程相比,线程是一种轻量级的工具,但是其创建和关闭依然需要花费时间,如果为每一个小的任务都创建一个线程,很有可能出现创 阅读全文

posted @ 2018-09-26 17:24 AoTuDeMan 阅读(453) 评论(0) 推荐(0)

线程阻塞工具类:LockSupport
摘要:LockSupport是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞。和Thread.suspend()相比,它弥补了由于resume()在前发生,导致线程无法继续执行的情况;和 Object.wait()相比,它不需要先获取某个对象的锁,也不会抛出InterruptedExce 阅读全文

posted @ 2018-09-26 10:52 AoTuDeMan 阅读(385) 评论(0) 推荐(0)

CountDownLatch(倒计时器)、CyclicBarrier(循环栅栏)
摘要:CountDownLatch(): CountDownLatch是一个非常实用的多线程控制工具类,这个工具通常用来控制线程等待,它可以让某一个线程等到倒计时结束,再开始执行。 CountDownLatch的构造函数接收一个整数为参数,即当前这个计数器的计数个数。 下面演示下CountDownLatc 阅读全文

posted @ 2018-09-25 17:34 AoTuDeMan 阅读(513) 评论(0) 推荐(0)

ReentrantReadWriteLock(读写锁)
摘要:ReentrantReadWriteLock是JDK5中提供的读写分离锁。读写分离锁可以有效的帮助减少锁的竞争,以此来提升系统的性能。用锁分离的机制来提升性能也非常好理解,比如线程A,B,C进行写操作,D,E,F进行读操作,如果使用ReentrantLock或者synchronized关键字,这些线 阅读全文

posted @ 2018-09-25 15:30 AoTuDeMan 阅读(358) 评论(0) 推荐(0)

ReentrantLock(重入锁)的好搭档:Condition 条件
摘要:如果大家理解了Object.Wait()和Object.notify()方法的话,那么就会很容易的了解Condition对象了;它和wait()和notify()方法的作用是一致的,但是wait()和notify()是和synchronized关键字合作使用的,而Condition是和Reentra 阅读全文

posted @ 2018-09-25 10:45 AoTuDeMan 阅读(1285) 评论(0) 推荐(0)

ReentrantLock
摘要:ReentrantLock可以完全替代synchronized关键字,在Java1.5之前,ReentrantLock的性能远远好与synchronized,在1.5之后,Java1.6开始,JDK在synchronized上做了大量的优化,使得两者的性能差距并不大,但是在使用的灵活性上,Reent 阅读全文

posted @ 2018-09-21 16:54 AoTuDeMan 阅读(385) 评论(0) 推荐(0)

synchronized
摘要:线程安全是并行程序的根本和根基。一般来说,程序的并行化是为了获取更高的执行效率,但前提是,高效率不能以牺牲正确为代价。 先看下面这种情况: 上述代码运行多次发现,输出都比20000小,我们用两个线程去各自累加10000次。这就是多线程中的线程不安全问题。 分析一下产生这种情况的原因: 两个线程同时读 阅读全文

posted @ 2018-09-20 15:15 AoTuDeMan 阅读(451) 评论(0) 推荐(0)

volatile
摘要:volatile英文解释为:易变的,不稳定的。这也就是volatile在Java关键字中的语义。 当你用volatile去申明一个变量时,就等于告诉了虚拟机,这个变量极有可能会被某些程序或者线程修改。为了确保这个变量被修改后,应用程序范围内的所有线程都能够“看到”这个改动,虚拟机就必须采取一些特殊的 阅读全文

posted @ 2018-09-19 21:45 AoTuDeMan 阅读(1209) 评论(0) 推荐(0)

线程等待(wait)、通知(notify)、等待线程结束(join)和谦让(yield)
摘要:线程等待(wait)、通知(notify) 为了支持多线程之间的协作,JDK提供了两个非常重要的接口:线程等待wait()和通知notify()方法。这两个方法并不是在Thread类中的,而是Object类,这也就意味着任何对象都可以调用者两个方法,下面来看这两个方法的签名: 当在一个对象实例上调用 阅读全文

posted @ 2018-09-19 14:40 AoTuDeMan 阅读(1105) 评论(0) 推荐(0)

线程中断
摘要:在Java中,线程中断是一种重要的线程协作机制,从表面上来看,中断就是让目标线程停止执行的意思,实际上却并非如此。 严格上讲,线程中断并不会使线程立即退出,而是给线程发送一个通知,告知目标线程,有人希望你退出了。至于目标线程接到通知后如何处理,则完全由目标线程自行决定。这点很重要,如果中断后,线程立 阅读全文

posted @ 2018-09-18 17:35 AoTuDeMan 阅读(308) 评论(0) 推荐(0)

JMM(Java Memory Model)、原子性、可见性,有序性
摘要:由于并发程序比串行程序复杂得多,其中一个重要原因是在并发程序下数据访问的一致性和安全性将会受到严重的挑战。我们需要在深入了解并行机制的前提下,再定义一种规则,保证多个线程间可以有效的,正确的协同工作。JMM就是为此而生的。 JMM的关键技术点都是围绕着多线程的原子性、可见性和有序性来建立的,下面我们 阅读全文

posted @ 2018-09-18 14:09 AoTuDeMan 阅读(688) 评论(0) 推荐(0)

并发级别
摘要:由于临界区的存在,多线程之间的并发必须受到控制,根据控制并发的策略,我们可以把并发的级别分类,大致上可以分为阻塞,无饥饿,无障碍、无锁、无等待几种。 1 阻塞 一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。比如:使用synchronize关键字或者其他重入锁,我们得到的就是阻塞 阅读全文

posted @ 2018-09-14 16:17 AoTuDeMan 阅读(1101) 评论(0) 推荐(0)

导航