10 2018 档案

JVM内存区域及对象
摘要:前言 我们都知道Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自不同的用途,以及创建和销毁的时间,有的区域随着虚拟机启动的进程而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如图所示 阅读全文

posted @ 2018-10-31 21:36 AoTuDeMan 阅读(161) 评论(0) 推荐(0)

缓冲区(Buffer)
摘要:什么是缓冲区? 定义: 缓冲区就是固定数量数据的容器,其作用是一个存储器,或者分段运输区,在这里数据可被存储并在之后用于检索。缓冲区像上一篇文章I/O 模型那样被写满和释放,对于每个非布尔原始数据类型都有一个缓冲区类,尽管缓冲区作用于它们存储的原始数据类型,但缓冲区十分倾向于处理字节,非字节缓冲区可 阅读全文

posted @ 2018-10-25 16:41 AoTuDeMan 阅读(2122) 评论(0) 推荐(0)

I/O 模型
摘要:Java传统IO,读取磁盘文件的数据过程大致如下图所示: 以FileInputStream类为例,对数据的读取进行说明。FileInputStream类有一个read(byte b[ ])方法,byte b[ ]就是我们用来存储读取到的数据,储存在用户空间的缓冲区。read(byte b[ ])方法 阅读全文

posted @ 2018-10-24 16:49 AoTuDeMan 阅读(293) 评论(0) 推荐(0)

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

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

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

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

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

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

Future模式
摘要:Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。当我们需要调用一个方法时,如果这个方法执行得很慢,那么我们就要进行等待;但是有时候,我们可能并不急着要结果。因此,我们可以让被调用者立即返回,让它在后台慢慢处理这个请求。对于调用者来说,则可以先处理一些其他任务,在真正需要 阅读全文

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

生产者-消费者模式
摘要:生产者-消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程负责具体处理生产者提交的任务。生产者和消费者之间通过共享内存缓冲区进行通信。 生产者-消费者模式的 阅读全文

posted @ 2018-10-19 09:54 AoTuDeMan 阅读(419) 评论(0) 推荐(0)

不变模式
摘要:在并发软件的开发过程中,同步操作是不可避免的。当多线程对同一个对象进行读写操作时,为了保证对象数据的一致性和正确性,有必要对对象进行同步。而同步对性能是有相当的损耗的。为了尽可能的除去这些同步操作,提高程序的并行性能,可以使用一种不可改变的对象,依靠对象的不变性,可以确保在没有同步的多线程环境中依然 阅读全文

posted @ 2018-10-17 15:50 AoTuDeMan 阅读(161) 评论(0) 推荐(0)

SynchronousQueue
摘要:之前在文章线程池的内部实现里讲到了一种特殊的队列,就是直接提交队列SynchronousQueue。SynchronousQueue的容量为0,任何一个对SynchronousQueue的写要等待一个对SynchronousQueue的读,反之也一样。因此SynchronousQueue与其说是一个 阅读全文

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

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

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

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

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

随机数据结构:跳表(SkipList)
摘要:在JDK的并发包中,除了常用的哈希表外,还有一种有趣的数据结构—跳表。跳表是一种可以用来快速查找的数据结构,有点类似于平衡树。它们的相同点都是可以对元素进行快速的查找。但有一个很重要的差别:对平衡树的插入和删除往往很可能导致平衡树进行一次全局的调整。而对跳表的插入和删除只需要对整个数据结构的局部进行 阅读全文

posted @ 2018-10-15 11:00 AoTuDeMan 阅读(705) 评论(0) 推荐(0)

数据共享通道:BlockingQueue
摘要:思考这样一个问题:在多线程的开发过程中,如何进行多个线程间的数据共享呢?比如:线程A希望给线程B发一个消息,用什么样的方式告知线程B比较合适呢? 解析:一般来说,我们希望整个系统是松散耦合的。就是说我们希望线程A能够通知线程B,又希望线程A不知道线程B的存在。这样,如果将来进行重构或者升级,我们可以 阅读全文

posted @ 2018-10-14 17:14 AoTuDeMan 阅读(305) 评论(0) 推荐(0)

CopyOnWriteArrayList
摘要:CopyOnWriteArrayList 是一个线程安全,读无锁写时复制的ArrayList。 CopyOnWriteArrayList 是典型的空间换时间方式。 写时复制:当新元素添加到CopyOnWriteArrayList时,会先把原来数组的元素拷贝到新的数组中,然后在新的数组中做写操作,写操 阅读全文

posted @ 2018-10-12 16:04 AoTuDeMan 阅读(392) 评论(0) 推荐(0)

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

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

枚举(enum)
摘要:枚举类型是指由一组固定的常量组成的合法值的类型。例如一年中的季节,太阳系的行星或者一副牌的花色等,在还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具名的int常量,一个类型成员一个常量,如下所示: 这样的方式叫做int枚举模式,这种模式有很多缺点: ⑴ 在类型的安全性和使用的方便性来说,对 阅读全文

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

高效读写的队列:ConcurrentLinkedQueue
摘要:队列(Queue)也是常用的数据结构之一。在JDK中提供了一个ConcurrentLinkedQueue类用来实现高并发的队列。从名字可以看出,这个队列是使用链表作为其数据的结构的。ConcurrentLinkedQueue应该算是在高并发的环境中性能最好的了。它之所以有很好的性能,是因为其内部复杂 阅读全文

posted @ 2018-10-10 10:45 AoTuDeMan 阅读(9949) 评论(4) 推荐(1)

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

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

导航