并发编程学习(18)-----第四部分-高级主题

引言:

    本文主要是对14,15,16,17篇文章进行总结。

总结:

    高级主题这个部分各个章节的关联性不打,所以没能画出具有逻辑关系的思维导图来,接下来我们对着个部分的四个章节进行概要的简单回顾。

    《显式锁》这章介绍了除synchronized之外的加锁方式,即显式锁。但是显式锁在java中的定位不是用于替代synchronized,而是作为其功能的补充。显示锁Lock的主要实现类是ReetrantLock,他可以提供定时获取,中断响应,公平性等一些列功能。在后面的章节中也可以看到,使用显式锁可以有效的配合显式的条件对象Condition使用,对条件谓语的定义更准确。在性能上,使用显式锁的性能并不会比使用synchronized更高,所以只要不需要用到synchronized不能提供的功能,是不需要使用显式锁的。显式锁的实现除了ReetrantLock之外,还有ReadWriteLock,其主要用于读多写少的并发程序,内部有写锁和读锁两个锁。

    《自定义同步工具》这章的主要内容是介绍当java不能提供我们所需要的并发工具时,如何开发自己的同步工具。通过对状态依赖性的管理介绍,我们的处理方式从传递异常到使用条件队列逐渐深入。条件队列是每个对象都有的储存线程的访问次序的队列。通过使用java内置的条件队列相关API,我们可以做到对线程的沉睡和唤醒,以管理同步工具的状态和他条件队列上的访问线程。然后,显示条件对象Condition也有一定程度的介绍,使用的API的java内置的条件队列API略有不同。最后,我们简要介绍了AQS,这是java内部提供的同步工具的核心工具类。通过以上的工具,我们就可以构建自己的同步工具类了。

    《非阻塞同步机制》这章简单的介绍了java是如何实现非阻塞同步算法的。其核心就是利用原理变量类,而原子变量类的核心是在虚拟机层次和处理器层次上的比较并交换操作。利用比较并交换操作和调用方的不停重试,我们可以实现简单的非阻塞同步。但是,当遇到像链条那样一个同步操作需要多个步骤时,就需要找出中间状态,如果前一个线程执行失败,就需要后一个调用线程先将前一个线程的工作处理完毕,然后才开始自己的操作。就性能上来说,在一般的低竞争条件下,非阻塞同步是要高于使用锁的。

    《Java内存模型》这章则简要介绍了为什么多个线程访问同一个位置所得到的值得结果不同的原因。多处理器架构,寄存器,主内存未同步,指令重排,等等都会导致这个问题的发生。在实际代码环境中,也就会导致我们遇到的并发问题。但是,在Java内存模型中,保证了最低程度的顺序的一致性,即Happens-Before关系,只要满足的这个关系,我们我们就可以判断出操作的前后,并且JVM保证不会进行重排。利用Happens-Before关系,我们也可以写出不需要锁的并发代码,但是,这对代码的顺序要求极为严苛。

你可能感兴趣的:(并发编程,并发编程,高级主题,总结)