文档章节

读书笔记之《Java并发编程的艺术》-并发编程容器和框架(重要)

Hi徐敏
 Hi徐敏
发布于 2015/11/11 17:42
字数 1090
阅读 622
收藏 13

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。

欢迎star、fork,读书笔记系列会同步更新

git

https://github.com/xuminwlt/j360-jdk

module

j360-jdk-thread/me.j360.jdk.concurrent

本系列分4篇

1、读书笔记之《Java并发编程的艺术》-并发编程基础

2、读书笔记之《Java并发编程的艺术》-java中的锁

3、读书笔记之《Java并发编程的艺术》-并发编程容器和框架(重要)

4、读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

本书前三章分别为

  1. 并发编程的挑战,也就是并发编程的缘由所在

  2. 底层的实现原理

  3. java内存模型

分别从cpu x86,x64以及内存模型等概念中描述java对并发编程的实现和控制,概念较为底层和基础,读书笔记略过前三章直接从第四章应用实现及原理基础开始。

章节

  1. 并发编程基础

  2. java中的锁

  3. 并发容器和框架(重点)

  4. 13个操作原子类

  5. java并发工具类

  6. 线程池

  7. Execurot框架

内容

本章节开始是我认为的重点,这里是平常开发中打交道最多的并发框架,在了解到并发编程的基础已经实现原理后,平常很少去使用,然后作为j2se5之后加入的并发框架,让从事java开发的咱们相比其他语言的程序员幸福的多,这一切皆因为Doug Lea大师不溃余力地为java开发者提供了非常多的java并发容器和框架

3节:并发容器和框架

ConcurrentHashMap

使用的锁分段技术,将数据一段一段地存储,给一段配一把锁

初始化

初始化方法通过initialCapacity、loadFactor、concurrencyLevel等几个参数来初始化segment数组、段偏移量segmentShift、段掩码segmentMask和每个segment里的HashEntity数组来实现的

操作

get操作,get操作的高效之处在于整个get过程不需要加锁,除非读到的值是空才会加锁重读。

public V get(Object key){
    int hash = hash(key.hashCode));
    return segmentFor(hash).get(key,hash);
}

put操作,需要对共享变量进行写入操作,为了线程安全

ConcurrentLinkedQueue

基于链接节点的无界线程安全队列,采用先进先出FIFO的规则对节点进行排序

Java中的阻塞队列

jdk7提供了7个阻塞队列

ArrayBlockingQueue

LinkedBlockingQueue

PriorityBlockingQueue

DelayQueue

SynchronusQueue

LinkedTransferQueue

LinkedBlockingDeque

Fork/join框架

jdk7提供的用于并行执行任务的框架

框架设计

步骤1:分隔任务

步骤2:执行任务并合并结果

Fork.join使用两个类来完成以上两件事情

1、ForkJoinTask

    RecursiveAction:用于没有返回结果的任务

    RecursiveTask:用于有返回结果的任务

2、ForkJoinPool

    ForkJonkTask需要通过ForkJoinPool来执行

使用Fork/join框架:计算1+2+3+4的结果

public class CountTask extends RecursiveTask<Integer> {

    private static final int THRESHOLD = 2; //阈值
    private int start;
    private int end;

    public CountTask(int start,int end){
        this.start = start;
        this.end = end;
    }
    @Override
    protected Integer compute() {
        int sum = 0;
        boolean canCompute = (end-start) <= THRESHOLD;
        if(canCompute){
            for(int i=start;i<=end;i++){
                sum += i;
            }
        }else{
            int middle = (start + end )/2;
            CountTask leftTask = new CountTask(start,middle);
            CountTask rightTask = new CountTask(middle,end);

            leftTask.fork();
            rightTask.fork();

            int leftResult = leftTask.join();
            int rightResult = rightTask.join();

            sum = leftResult + rightResult;

        }
        return sum;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        CountTask task = new CountTask(1,4);
        Future<Integer> result = forkJoinPool.submit(task);
        try {
            System.out.println(result.get());
        }catch (Exception e){

        }
    }
}


4节:13个操作原子类

concurrent包下面atomic包提供了13个类,属于4种类型的原子更新方式

  1. 原子更新基本类型

  2. 原子更新数组

  3. 原子更新引用

  4. 原子更新属性

基本都是使用Unsafe实现的包装类

5节:并发工具类

等待多线程完成的CountDownLatch

允许一个或者多个线程等待其他线程完成操作

同步屏障CyclickBarrier

让一组线程到达一个屏障后阻塞,直到最后一个线程到达屏障才会开门

控制并发线程数的Semaphore

控制同时访问特定资源的线程数量

线程间交换数据Exchanger

提供一个同步点,在这个同步点,两个线程之间可以交换数据



© 著作权归作者所有

Hi徐敏
粉丝 124
博文 40
码字总数 67954
作品 0
静安
架构师
私信 提问
加载中

评论(1)

编走编想
编走编想
ConcurrentSkipListMap
读书笔记之《Java并发编程的艺术》-并发编程基础

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
8
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
1
读书笔记之《Java并发编程的艺术》-java中的锁

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
0
Android--面试中遇到的问题总结(三)

《Android 开发工程师面试指南 LearningNotes 》,作者是陶程,由梁观全贡献部分。大家可以去知乎关注这两位用心的少年。这份指南包含了大部分Android开发的基础、进阶知识,不仅可以帮助准备...

sealin
2017/02/22
0
0
BAT等大厂Android面试书单和知识点清单

java是Android开发的基础,在BAT的初面中,会涉及到比较多的java基础知识,所以比较重要,下面我介绍的书籍内容是由浅到深。 1.Thinking in java:这本书被称为Java的三大圣经之一,虽然书比...

android自学
2018/07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mac部分目录读写提示“Operation not permitted”解决

今天试图在mac os x下重命名/usr/bin/python,提示Operation not permitted,虽然我是root,很奇怪。原来mac os x里还有一个安全机制:rootless,少用root。参考这篇文章如何开关rootless,不...

swingcoder
23分钟前
1
0
49.Nginx防盗链 访问控制 解析php相关 代理服务器

12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置(502的问题) 12.16 Nginx代理 扩展 502问题汇总 http://ask.apelearn.com/question/9109 location优先级 http://blog....

oschina130111
28分钟前
0
0
信必优成功案例 – 中国网络电视台(CNTV)

项目背景 •中国网络电视台(英文简称CNTV),由央视国际网络有限公司主办,是中央电视台旗下的国家网络广播电视播出机构。中国网络电视台全面部署多终端业务架构,已建设网络电视、IP电视、...

symbiochina88
29分钟前
0
0
redis cluster集群 三主三从

redis 集群一般由 多个节点 组成,节点数量至少为 6 个,才能保证组成 完整高可用 的集群。每个节点需要 开启配置 cluster-enabled yes,让 redis 运行在 集群模式 下。 redis5之后使用redis...

MonroeCode
30分钟前
0
0
新东方的Kubernetes实践:从服务化ES到Kafka和Redis

2017年,新东方开始了利用容器化手段将中间件业务服务化的探索,基于Rancher 1.6使用ES;2019年,新东方再次开始了扩大了中间件的业务服务化,基于Kubernetes使用Kafka、ES和Redis。在服务化...

RancherLabs
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部