当前位置:首页 > Java > Java编程pdf电子书下载
《Java并发编程实战》电子书封面

Java并发编程实战

  • 发布时间:2020年11月12日 10:34:12
  • 作者:Brian Goetz
  • 大小:9 MB
  • 类别:Java编程电子书
  • 格式:PDF
  • 版本:超清版
  • 评分:9.4

    Java并发编程实战 PDF 超清版

      给大家带来的一篇关于Java编程相关的电子书资源,介绍了关于Java、并发编程方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小9 MB,Brian Goetz编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:8.6分

      Tags:java 并发编程 

      内容介绍

      Java并发编程实战》深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容,*后介绍了一些高级主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的同步工具类。

      本书适合有Java基础的程序开发人员阅读。

      本书涵盖的内容包括:

      • 并发性与线程安全性的基本概念
      • 构建以及组合各种线程安全类的技术
      • 使用java.util.concurrent包中的各种并发构建基础模块
      • 性能优化中的注意事项
      • 如何测试并发程序
      • 以及一些高级主题,包括原子变量,无阻塞算法以及Java内存模型

      目录

      • 第1章简介
      • 1.1并发简史
      • 1.2线程的优势
      • 1.2.1发挥多处理器的强大能力
      • 1.2.2建模的简单性
      • 1.2.3异步事件的简化处理
      • 1.2.4响应更灵敏的用户界面
      • 1.3线程带来的风险
      • 1.3.1安全性问题
      • 1.3.2活跃性问题
      • 1.3.3性能问题
      • 1.4线程无处不在
      • 第一部分基础知识
      • 第2章线程安全性
      • 2.1什么是线程安全性
      • 2.2原子性
      • 2.2.1竞态条件
      • 2.2.2示例:延迟初始化中的竞态条件
      • 2.2.3复合操作
      • 2.3加锁机制
      • 2.3.1内置锁
      • 2.3.2重入
      • 2.4用锁来保护状态
      • 2.5活跃性与性能
      • 第3章对象的共享
      • 3.1可见性
      • 3.1.1失效数据
      • 3.1.2非原子的64位操作
      • 3.1.3加锁与可见性
      • 3.1.4Volatile变量
      • 3.2发布与逸出
      • 3.3线程封闭
      • 3.3.1Ad-hoc线程封闭
      • 3.3.2栈封闭
      • 3.3.3ThreadLocal类
      • 3.4不变性
      • 3.4.1Final域
      • 3.4.2示例:使用Volatile类型来发布不可变对象
      • 3.5安全发布
      • 3.5.1不正确的发布:正确的对象被破坏
      • 3.5.2 不可变对象与初始化安全性
      • 3.5.3安全发布的常用模式
      • 3.5.4事实不可变对象
      • 3.5.5可变对象
      • 3.5.6安全地共享对象
      • 第4章对象的组合
      • 4.1设计线程安全的类
      • 4.1.1收集同步需求
      • 4.1.2依赖状态的操作
      • 4.1.3状态的所有权
      • 4.2实例封闭
      • 4.2.1Java监视器模式
      • 4.2.2示例:车辆追踪
      • 4.3线程安全性的委托
      • 4.3.1示例:基于委托的车辆追踪器
      • 4.3.2独立的状态变量
      • 4.3.3当委托失效时
      • 4.3.4发布底层的状态变量
      • 4.3.5示例:发布状态的车辆追踪器
      • 4.4在现有的线程安全类中添加功能
      • 4.4.1客户端加锁机制
      • 4.4.2组合
      • 4.5将同步策略文档化
      • 第5章基础构建模块
      • 5.1同步容器类
      • 5.1.1同步容器类的问题
      • 5.1.2迭代器与Concurrent-ModificationException
      • 5.1.3隐藏迭代器
      • 5.2并发容器
      • 5.2.1ConcurrentHashMap
      • 5.2.2额外的原子Map操作
      • 5.2.3CopyOnWriteArrayList
      • 5.3阻塞队列和生产者-消费者模式
      • 5.3.1示例:桌面搜索
      • 5.3.2串行线程封闭
      • 5.3.3双端队列与工作密取
      • 5.4阻塞方法与中断方法
      • 5.5同步工具类
      • 5.5.1闭锁
      • 5.5.2FutureTask
      • 5.5.3信号量
      • 5.5.4栅栏
      • 5.6构建高效且可伸缩的结果缓存
      • 第二部分结构化并发应用程序
      • 第6章任务执行
      • 6.1在线程中执行任务
      • 6.1.1串行地执行任务
      • 6.1.2显式地为任务创建线程
      • 6.1.3无限制创建线程的不足
      • 6.2Executor框架
      • 6.2.1示例:基于Executor的Web服务器
      • 6.2.2执行策略
      • 6.2.3线程池
      • 6.2.4Executor的生命周期
      • 6.2.5延迟任务与周期任务
      • 6.3找出可利用的并行性
      • 6.3.1示例:串行的页面渲染器
      • 6.3.2携带结果的任务Callable与Future
      • 6.3.3示例:使用Future实现页面渲染器
      • 6.3.4在异构任务并行化中存在的局限
      • 6.3.5CompletionService:Executor与BlockingQueue
      • 6.3.6示例:使用CompletionService实现页面渲染器
      • 6.3.7为任务设置时限
      • 6.3.8示例:旅行预定门户网站
      • 第7章取消与关闭
      • 7.1任务取消
      • 7.1.1中断
      • 7.1.2中断策略
      • 7.1.3响应中断
      • 7.1.4示例:计时运行
      • 7.1.5通过Future来实现取消
      • 7.1.6处理不可中断的阻塞
      • 7.1.7采用newTaskFor来封装非标准的取消
      • 7.2停止基于线程的服务
      • 7.2.1示例:日志服务
      • 7.2.2关闭ExecutorService
      • 7.2.3“毒丸”对象
      • 7.2.4示例:只执行一次的服务
      • 7.2.5shutdownNow的局限性
      • 7.3处理非正常的线程终止
      • 7.4JVM关闭
      • 7.4.1关闭钩子
      • 7.4.2守护线程
      • 7.4.3终结器
      • 第8章线程池的使用
      • 8.1在任务与执行策略之间的隐性耦合
      • 8.1.1线程饥饿死锁
      • 8.1.2运行时间较长的任务
      • 8.2设置线程池的大小
      • 8.3配置ThreadPoolExecutor
      • 8.3.1线程的创建与销毁
      • 8.3.2管理队列任务
      • 8.3.3饱和策略
      • 8.3.4线程工厂
      • 8.3.5在调用构造函数后再定制ThreadPoolExecutor
      • 8.4扩展 ThreadPoolExecutor
      • 8.5递归算法的并行化
      • 第9章图形用户界面应用程序
      • 9.1为什么GUI是单线程的
      • 9.1.1串行事件处理
      • 9.1.2Swing中的线程封闭机制
      • 9.2短时间的GUI任务
      • 9.3长时间的GUI任务
      • 9.3.1取消
      • 9.3.2进度标识和完成标识
      • 9.3.3SwingWorker
      • 9.4共享数据模型
      • 9.4.1线程安全的数据模型
      • 9.4.2分解数据模型
      • 9.5其他形式的单线程子系统
      • 第三部分活跃性、性能与测试
      • 第10章避免活跃性危险
      • 10.1死锁
      • 10.1.1锁顺序死锁
      • 10.1.2动态的锁顺序死锁
      • 10.1.3在协作对象之间发生的死锁
      • 10.1.4开放调用
      • 10.1.5资源死锁
      • 10.2死锁的避免与诊断
      • 10.2.1支持定时的锁
      • 10.2.2通过线程转储信息来分析死锁
      • 10.3其他活跃性危险
      • 10.3.1饥饿
      • 10.3.2糟糕的响应性
      • 10.3.3活锁
      • 第11章性能与可伸缩性
      • 11.1对性能的思考
      • 11.1.1性能与可伸缩性
      • 11.1.2评估各种性能权衡因素
      • 11.2Amdahl定律
      • 11.2.1示例:在各种框架中隐藏的串行部分
      • 11.2.2Amdahl定律的应用
      • 11.3线程引入的开销
      • 11.3.1上下文切换
      • 11.3.2内存同步
      • 11.3.3阻塞
      • 11.4减少锁的竞争
      • 11.4.1缩小锁的范围(“快进快出”)
      • 11.4.2减小锁的粒度
      • 11.4.3锁分段
      • 11.4.4避免热点域
      • 11.4.5一些替代独占锁的方法
      • 11.4.6监测CPU的利用率
      • 11.4.7向对象池说“不”
      • 11.5示例:比较Map的性能
      • 11.6减少上下文切换的开销
      • 第12章并发程序的测试
      • 12.1正确性测试
      • 12.1.1基本的单元测试
      • 12.1.2对阻塞操作的测试
      • 12.1.3安全性测试
      • 12.1.4资源管理的测试
      • 12.1.5使用回调
      • 12.1.6产生更多的交替操作
      • 12.2性能测试
      • 12.2.1在PutTakeTest中增加计时功能
      • 12.2.2多种算法的比较
      • 12.2.3响应性衡量
      • 12.3避免性能测试的陷阱
      • 12.3.1垃圾回收
      • 12.3.2动态编译
      • 12.3.3对代码路径的不真实采样
      • 12.3.4不真实的竞争程度
      • 12.3.5无用代码的消除
      • 12.4其他的测试方法
      • 12.4.1代码审查
      • 12.4.2静态分析工具
      • 12.4.3面向方面的测试技术
      • 12.4.4分析与监测工具
      • 第四部分高级主题
      • 第13章显式锁
      • 13.1Lock与 ReentrantLock
      • 13.1.1轮询锁与定时锁
      • 13.1.2可中断的锁获取操作
      • 13.1.3非块结构的加锁
      • 13.2性能考虑因素
      • 13.3公平性
      • 13.4在synchronized和ReentrantLock之间进行选择
      • 13.5读-写锁
      • 第14章构建自定义的同步工具
      • 14.1状态依赖性的管理
      • 14.1.1示例:将前提条件的失败传递给调用者
      • 14.1.2示例:通过轮询与休眠来实现简单的阻塞
      • 14.1.3条件队列
      • 14.2使用条件队列
      • 14.2.1条件谓词
      • 14.2.2过早唤醒
      • 14.2.3丢失的信号
      • 14.2.4通知
      • 14.2.5示例:阀门类
      • 14.2.6子类的安全问题
      • 14.2.7封装条件队列
      • 14.2.8入口协议与出口协议
      • 14.3显式的Condition对象
      • 14.4Synchronizer剖析
      • 14.5AbstractQueuedSynchronizer
      • 14.6java.util.concurrent同步器类中的 AQS
      • 14.6.1ReentrantLock
      • 14.6.2Semaphore与CountDownLatch
      • 14.6.3FutureTask
      • 14.6.4ReentrantReadWriteLock
      • 第15章原子变量与非阻塞同步机制
      • 15.1锁的劣势
      • 15.2硬件对并发的支持
      • 15.2.1比较并交换
      • 15.2.2非阻塞的计数器
      • 15.2.3JVM对CAS的支持
      • 15.3原子变量类
      • 15.3.1原子变量是一种“更好的volatile”
      • 15.3.2性能比较:锁与原子变量
      • 15.4非阻塞算法
      • 15.4.1非阻塞的栈
      • 15.4.2非阻塞的链表
      • 15.4.3原子的域更新器
      • 15.4.4ABA问题
      • 第16章Java内存模型
      • 16.1什么是内存模型,为什么需要它
      • 16.1.1平台的内存模型
      • 16.1.2重排序
      • 16.1.3Java内存模型简介
      • 16.1.4借助同步
      • 16.2发布
      • 16.2.1不安全的发布
      • 16.2.2安全的发布
      • 16.2.3安全初始化模式
      • 16.2.4双重检查加锁
      • 16.3初始化过程中的安全性
      • 附录A并发性标注

      读书笔记

      Java多线程并发开发之DelayQueue使用示例

      在学习Java 多线程并发开发过程中,了解到DelayQueue类的主要作用:是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。

      Delayed,一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对象。此接口的实现必须定义一个 compareTo 方法,该方法提供与此接口的 getDelay 方法一致的排序。

      在网上看到了一些示例,发现有的示例存在一些问题,做了些修改,希望能帮助大家理解。

      中国人都喜欢K歌,大部分人的内心都住着一个歌手的梦,尤其是学生时代,大家都喜欢组团去KTV唱歌,一唱一下午,大家都唱得很爽。话说又到了一年一度的双11,许多的单身狗开始组团来到KTV唱歌。那么KTV这个时候如何通过程序来收费记时的呢,模拟的代码如下:

      public class KTV implements Runnable{
        private DelayQueue<KTVConsumer> queue = new DelayQueue<>();
      
        public void begin(String name,String boxNum,int money){
      
          KTVConsumer man = new KTVConsumer(name,boxNum,20l*money+System.currentTimeMillis());
          System.out.println(man.getName()+" 等人交了"+money+"元钱,进入"+man.getBoxNum()+"号包厢,开始K歌...");
          this.queue.add(man);
        }
      
        public void end(KTVConsumer man){
          System.out.println(man.getName()+" 等人所在的"+man.getBoxNum()+"号包厢,时间到...");
        }
      
        @Override
        public void run() {
          // TODO Auto-generated method stub
          while(true){
            try {
              KTVConsumer man = queue.take();
              end(man);
            } catch (InterruptedException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
            }
          }
        }
      
        public static void main(String args[]){
          try{
            System.out.println("KTV正常营业");
            System.out.println("================================");
            KTV ktv = new KTV();
            Thread sing = new Thread(ktv);
            sing.start();
            new Thread(new Runnable() {
              @Override
              public void run() {
                ktv.begin("张三", "111", 500);
              }
            }).start();
      
            new Thread(new Runnable() {
              @Override
              public void run() {
                ktv.begin("李四", "666", 200);
              }
            }).start();
      
            Thread.sleep(2000);
            new Thread(new Runnable() {
              @Override
              public void run() {
                ktv.begin("王五", "888", 100);
                System.out.println("================================");
              }
            }).start();
      
          }
          catch(Exception ex){
      
          }
      
        }
      }
      public class KTVConsumer implements Delayed{
        private String name;
        //截止时间
        private long endTime;
        //包厢号
        private String boxNum;
      
        public KTVConsumer(String name,String boxNum,long endTime){
          this.name=name;
          this.boxNum=boxNum;
          this.endTime=endTime;
        }
      
        public String getName(){
          return this.name;
        }
      
        public String getBoxNum(){
          return this.boxNum;
        }
      
        /**
         * 用来判断是否到了截止时间
         */
        @Override
        public long getDelay(TimeUnit unit) {
          // TODO Auto-generated method stub
          return unit.convert(endTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
        }
      
        /**
         * 相互比较排序用
         */
        @Override
        public int compareTo(Delayed o) {
          // TODO Auto-generated method stub
          if(o == null || ! (o instanceof KTVConsumer)) return 1;
          if(o == this) return 0;
          KTVConsumer s = (KTVConsumer)o;
          return endTime - s.endTime > 0 ? 1 :(endTime - s.endTime == 0 ? 0 : -1);
        }
      }
      

      运行的结果如下:

      KTV正常营业
      ================================
      张三 等人交了500元钱,进入111号包厢,开始K歌...
      李四 等人交了200元钱,进入666号包厢,开始K歌...
      王五 等人交了100元钱,进入888号包厢,开始K歌...
      ================================
      李四 等人所在的666号包厢,时间到...
      王五 等人所在的888号包厢,时间到...
      张三 等人所在的111号包厢,时间到...
      

      以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

      以上就是本次介绍的Java编程电子书的全部相关内容,希望我们整理的资源能够帮助到大家,感谢大家对码农之家的支持。

      上一篇:ArcGIS软件与应用

      下一篇:Photoshop CS3中文版实例教程

      查看更多
      读者心得
      9小时35分钟前回答

      Java并发底层实现原理学习心得

      我们知道java实现的并发操作最后肯定是由我们的CPU完成的,中间经历了将java源码编译成.class文件,然后进行加载,然后虚拟机执行引擎进行执行,解释为汇编语言,然后转为操作系统指令,然后转为1,0,最后CPU进行识别执行。 提到java的并发,我们不由的就会想到java中常见的键字:volatile和synchronized,我们接下来就会从这两个关机字展开分析: volatile的底层实现原理 synchronized的实现原理和应用 volatile 说到volatile,在java的面试中面试官可是最喜欢问的问题了。看到它我们首先想到的便是保持线程间的可见性,是一个轻量级的synchronized,在一些情况下它可以代替synchronized。 volatile的作用: 一个被volat……

      31小时25分钟前回答

      Java并发系列之ConcurrentHashMap源码分析

      我们知道哈希表是一种非常高效的数据结构,设计优良的哈希函数可以使其上的增删改查操作达到O(1)级别。Java为我们提供了一个现成的哈希结构,那就是HashMap类,在前面的文章中我曾经介绍过HashMap类,知道它的所有方法都未进行同步,因此在多线程环境中是不安全的。为此,Java为我们提供了另外一个HashTable类,它对于多线程同步的处理非常简单粗暴,那就是在HashMap的基础上对其所有方法都使用synchronized关键字进行加锁。这种方法虽然简单,但导致了一个问题,那就是在同一时间内只能由一个线程去操作哈希表。即使这些线程都只是进行读操作也必须要排队,这在竞争激烈的多线程环境中极为影响性……

      码农之家

      空英悟 提供上传

      资源
      37
      粉丝
      13
      喜欢
      128
      评论
      11

      Copyright 2018-2021 www.xz577.com 码农之家

      版权投诉 / 书籍推广:520161757@qq.com