当前位置:当前位置:主页 > 计算机电子书 > Java > Java编程 pdf电子书
Java多线程编程核心技术(第3版)

Java多线程编程核心技术(第3版) PDF 清晰完整版

  • 更新:2022-04-02
  • 大小:35.1 MB
  • 类别:Java编程
  • 作者:高洪岩
  • 出版:机械工业出版社
  • 格式:PDF

  • 资源介绍
  • 学习心得
  • 相关内容

Java多线程编程核心技术(第3版)》是由机械工业出版社出版的一本关于Java编程方面的书籍,作者是高洪岩,主要介绍了关于Java、多线程编程、Java核心技术方面的知识内容,目前在Java编程类书籍综合评分为:8.1分。

书籍介绍

编辑推荐

1.畅销书作者撰写,全新升级,新增适用微服务与分布式开发的并发工具与Java线程池

2.全面剖析多线程编程的核心库、方法、原理,案例式教学,透彻了解高并发本质与应对方法

内容简介

现代软件规模大、实时性要求高,所以掌握提升处理和响应速度的多线程技术势在必行。本书涵盖多线程编程的核心库、方法、原理,透彻讲解了高并发的本质与应对方法,帮助读者解决高并发环境下的业务瓶颈。
●本书具体内容如下。
第1章讲解Java多线程的基础知识,包括Thread类的核心API的使用。
第2章讲解在多线程中通过synchronized关键字对并发访问进行控制的方法,为读者学习同步知识打好坚实的基础。
第3章介绍线程间通信,以在多线程中进行数据传递。
第4章介绍并发访问时的同步处理实现,包括读写锁(Lock对象)等相关技术点。
第5章剖析定时器Timer类的内部原理。定时器在Android开发中会有深入应用,是很重要的技术点。
第6章介绍单例模式下多线程的全面解决方案。
第7章对前面遗漏的知识点进行补充,使多线程的知识体系更加完整,尽量做到不出现技术空白点。
第8章介绍并发集合框架,可以大大提升开发多线程应用程序的效率。
第9章介绍线程池的使用,让线程管理更规范、高效。这也是Java程序员面试必问的技术点。

作者简介

高洪岩

某世界500强公司项目经理,有10年Java开发和项目管理经验,精通Java语言,擅长JavaEE、分布式、微服务、高性能服务器架构、智能报表、多线程和高并发相关的技术内容,理论与实践经验颇丰,也积极参与开源项目的开发与设计,涉及Dubbo、Jedis、Pulsar、ZooKeeper等主流开源项目。
著有《Java多线程编程核心技术》《Java并发编程:核心方法与框架》《NIO与Socket编程技术指南》《JavaEE核心框架实战(第2版)》等多本图书。

目录

  • 第1章Java多线程技能1
  • 1.1进程和线程的定义及多线程的优点1
  • 1.2使用多线程5
  • 1.2.1继承Thread类6
  • 1.2.2使用常见的3个命令分析线程的信息8
  • 1.2.3线程随机性的展现10
  • 1.2.4执行start()的顺序不代表执行run()的顺序12
  • 1.2.5实现Runnable接口14
  • 1.2.6使用Runnable接口实现多线程的优点15
  • 1.2.7publicThread(Runnabletarget)中的target参数16
  • 1.2.8实例变量共享导致的“非线程安全”问题与相应的解决方案18
  • 1.2.9Servlet技术也会引起“非线程安全”问题22
  • 1.2.10留意i--与System.out.println()出现的“非线程安全”问题25
  • 1.2.11方法run()被JVM所调用27
  • 1.3方法currentThread()27
  • 1.4方法isAlive()30
  • 1.5方法sleep(longmillis)33
  • 1.6方法sleep(longmillis,intnanos)34
  • 1.7方法StackTraceElement[]getStack-Trace()35
  • 1.8方法staticvoiddumpStack()36
  • 1.9方法MapgetAllStackTraces()37
  • 1.10方法getId()39
  • 1.11停止线程40
  • 1.11.1停止不了的线程41
  • 1.11.2判断线程是不是停止状态42
  • 1.11.3清除中断状态的使用场景44
  • 1.11.4能停止的线程—异常法48
  • 1.11.5在sleep状态下停止51
  • 1.11.6使用stop()暴力停止线程53
  • 1.11.7方法stop()与java.lang.Thread-Death异常55
  • 1.11.8使用stop()释放锁导致数据结果不一致57
  • 1.11.9使用return;语句停止线程的缺点及相应的解决方案59
  • 1.12暂停线程61
  • 1.12.1方法suspend()与resume()的使用62
  • 1.12.2方法suspend()与resume()的缺点—独占63
  • 1.12.3方法suspend()与resume()的缺点—数据不完整66
  • 1.12.4使用LockSupport类实现线程暂停与恢复67
  • 1.13方法yield()69
  • 1.14线程的优先级70
  • 1.14.1线程优先级的继承特性71
  • 1.14.2线程优先级的规律性72
  • 1.14.3线程优先级的随机性75
  • 1.14.4看谁跑得快76
  • 1.15守护线程78
  • 1.16并发与并行79
  • 1.17同步与异步80
  • 1.18多核CPU不一定比单核CPU运行快81
  • 1.19本章小结82
  • 第2章对象及变量的并发访问83
  • 2.1synchronized同步方法83
  • 2.1.1方法内的变量是线程安全的83
  • 2.1.2实例变量“非线程安全”问题及解决方案85
  • 2.1.3同步synchronized在字节码指令中的原理88
  • 2.1.4多个对象多个锁90
  • 2.1.5synchronized方法将对象作为锁92
  • 2.1.6脏读与解决97
  • 2.1.7synchronized锁重入99
  • 2.1.8继承环境下的锁重入100
  • 2.1.9出现异常,锁自动释放102
  • 2.1.10非同步方法?:不使用synchronized重写方法104
  • 2.2synchronized同步语句块106
  • 2.2.1synchronized方法的弊端106
  • 2.2.2synchronized同步代码块的使用109
  • 2.2.3用同步代码块解决同步方法的弊端111
  • 2.2.4一半异步,一半同步112
  • 2.2.5synchronized代码块间的同步性114
  • 2.2.6方法println()也是同步的116
  • 2.2.7验证synchronized(this)同步代码块是锁定当前对象的117
  • 2.2.8将任意对象作为锁119
  • 2.2.9多个锁就是异步执行121
  • 2.2.10验证方法被调用是随机的124
  • 2.2.11不同步导致的逻辑错误与解决方案125
  • 2.2.12细化验证3个结论129
  • 2.2.13类对象的单例性134
  • 2.2.14静态同步?:synchronized方法与synchronized(class)代码块135
  • 2.2.15同步synchronized方法可以对类的所有对象实例起作用139
  • 2.2.16同步synchronized(class)代码块可以对类的所有对象实例起作用141
  • 2.2.17String常量池特性与同步问题143
  • 2.2.18synchronized方法无限等待问题与解决方案146
  • 2.2.19多线程的死锁148
  • 2.2.20内置类与静态内置类150
  • 2.2.21内置类与同步?:实验1153
  • 2.2.22内置类与同步?:实验2155
  • 2.2.23锁对象改变导致异步执行156
  • 2.2.24锁对象不改变依然是同步执行159
  • 2.2.25同步写法案例比较161
  • 2.2.26方法holdsLock(Objectobj)的使用161
  • 2.2.27临界区162
  • 2.3volatile关键字162
  • 2.3.1可见性的测试163
  • 2.3.2原子性与非原子性的测试171
  • 2.3.3禁止代码重排序的测试179
  • 2.4本章小结190
  • 第3章线程间通信191
  • 3.1wait/notify机制191
  • 3.1.1不使用wait/notify机制进行通信的缺点191
  • 3.1.2什么是wait/notify机制194
  • 3.1.3wait/notify机制的原理194
  • 3.1.4方法wait()的基本用法195
  • 3.1.5使用代码完整实现wait/notify机制196
  • 3.1.6使用wait/notify机制实现线程销毁198
  • 3.1.7对业务代码进行封装200
  • 3.1.8线程状态的切换203
  • 3.1.9方法wait()导致锁立即释放204
  • 3.1.10方法sleep()不释放锁206
  • 3.1.11方法notify()不立即释放锁206
  • 3.1.12方法interrupt()遇到方法wait()208
  • 3.1.13方法notify()只通知一个线程210
  • 3.1.14方法notifyAll()通知所有线程212
  • 3.1.15方法wait(long)的基本用法213
  • 3.1.16方法wait(long)自动向下运行的条件215
  • 3.1.17通知过早与相应的解决方案218
  • 3.1.18等待条件发生变化220
  • 3.1.19生产者/消费者模式实现224
  • 3.1.20在管道中传递字节流239
  • 3.1.21在管道中传递字符流241
  • 3.1.22利用wait/notify机制实现交叉备份244
  • 3.1.23方法sleep()和wait()的区别247
  • 3.2方法join()的使用247
  • 3.2.1学习方法join()前的铺垫247
  • 3.2.2用方法join()解决问题248
  • 3.2.3方法join()和interrupt()出现异常250
  • 3.2.4方法join(long)的使用252
  • 3.2.5方法join(long)与sleep(long)的区别254
  • 3.2.6方法join()后的代码提前运行257
  • 3.2.7方法join(longmillis,intnanos)的使用261
  • 3.3类ThreadLocal的使用262
  • 3.3.1方法get()与null262
  • 3.3.2类ThreadLocal存取数据流程分析263
  • 3.3.3验证线程变量的隔离性266
  • 3.3.4解决get()返回null的问题270
  • 3.3.5验证重写initialValue()方法的隔离性271
  • 3.3.6使用remove()方法的必要性272
  • 3.4类InheritableThreadLocal的使用276
  • 3.4.1类ThreadLocal不能实现值继承277
  • 3.4.2使用InheritableThreadLocal体现值继承特性278
  • 3.4.3值继承特性在源代码中的执行流程280
  • 3.4.4父线程有的值,子线程还是旧值?:不可变类型285
  • 3.4.5子线程有的值,父线程还是旧值?:不可变类型286
  • 3.4.6子线程可以感应对象属性值的变化?:可变类型288
  • 3.4.7重写childValue方法实现对继承值的加工291
  • 3.5本章小结291
  • 第4章锁的使用292
  • 4.1使用ReentrantLock类292
  • 4.1.1使用ReentrantLock实现同步292
  • 4.1.2验证多代码块间的同步性294
  • 4.1.3方法await()的错误用法与相应的解决方案297
  • 4.1.4使用方法await()和方法signal()实现wait/notify300
  • 4.1.5方法await()暂停的原理302
  • 4.1.6通知部分线程?:错误用法306
  • 4.1.7通知部分线程?:正确用法308
  • 4.1.8实现生产者/消费者模式一对一交替打印311
  • 4.1.9实现生产者/消费者模式多对多交替打印313
  • 4.1.10公平锁与非公平锁315
  • 4.1.11方法getHoldCount()的使用318
  • 4.1.12方法getQueueLength()的使用319
  • 4.1.13方法getWaitQueueLength(Conditioncondition)的使用321
  • 4.1.14方法hasQueuedThread(Threadthread)的使用322
  • 4.1.15方法hasQueuedThreads()的使用323
  • 4.1.16方法hasWaiters(Conditioncondition)的使用324
  • 4.1.17方法isFair()的使用326
  • 4.1.18方法isHeldByCurrentThread()的使用326
  • 4.1.19方法isLocked()的使用327
  • 4.1.20方法lockInterruptibly()的使用328
  • 4.1.21方法tryLock()的使用330
  • 4.1.22方法tryLock(longtimeout,Time-Unitunit)的使用331
  • 4.1.23方法await(longtime,TimeUnitunit)的使用333
  • 4.1.24方法awaitNanos(longnanos-Timeout)的使用334
  • 4.1.25方法awaitUntil(Datedeadline)的使用335
  • 4.1.26方法awaitUninterruptibly()的使用337
  • 4.1.27实现线程按顺序执行业务339
  • 4.2使用ReentrantReadWriteLock类342
  • 4.2.1类ReentrantLock的缺点342
  • 4.2.2读读共享344
  • 4.2.3写写互斥344
  • 4.2.4读写互斥345
  • 4.2.5写读互斥346
  • 4.3本章小结347
  • 第5章定时器348
  • 5.1定时器的使用348
  • 5.1.1方法schedule(TimerTasktask,Datetime)的测试349
  • 5.1.2方法schedule(TimerTasktask,Datef?irstTime,longperiod)的测试357
  • 5.1.3方法schedule(TimerTasktask,longdelay)的测试365
  • 5.1.4方法schedule(TimerTasktask,longdelay,longperiod)的测试365
  • 5.1.5方法scheduleAtFixedRate(TimerTasktask,Datef?irst-Time,longperiod)的测试366
  • 5.2本章小结374
  • 第6章单例模式与多线程375
  • 6.1单例模式与多线程375
  • 6.1.1立即加载/饿汉模式375
  • 6.1.2延迟加载/懒汉模式377
  • 6.1.3使用静态内置类实现单例模式388
  • 6.1.4序列化与反序列化的单例模式实现389
  • 6.1.5使用static代码块实现单例模式392
  • 6.1.6使用enum枚举数据类型实现单例模式393
  • 6.1.7完善使用enum枚举实现单例模式394
  • 6.2本章小结396
  • 第7章拾遗增补397
  • 7.1线程的状态397
  • 7.1.1验证NEW、RUNNABLE和TERMINATED399
  • 7.1.2验证TIMED_WAITING400
  • 7.1.3验证BLOCKED401
  • 7.1.4验证WAITING403
  • 7.2线程组404
  • 7.2.1线程对象关联线程组?:一级关联404
  • 7.2.2线程对象关联线程组?:多级关联406
  • 7.2.3线程组自动归属特性407
  • 7.2.4获取根线程组408
  • 7.2.5线程组内加线程组409
  • 7.2.6组内的线程批量停止409
  • 7.2.7递归取得与非递归取得组内对象410
  • 7.3Thread.activeCount()方法的使用412
  • 7.4Thread.enumerate(Threadtarray[])方法的使用412
  • 7.5再次验证线程执行有序性412
  • 7.6类SimpleDateFormat非线程安全414
  • 7.6.1出现异常415
  • 7.6.2解决方法1417
  • 7.6.3解决方法2418
  • 7.7线程中出现异常的处理420
  • 7.7.1线程出现异常的默认行为420
  • 7.7.2使用setUncaughtException-Handler()方法进行异常处理421
  • 7.7.3使用setDefaultUncaught-ExceptionHandler()方法进行异常处理422
  • 7.8线程组内处理异常423
  • 7.9线程异常处理的优先性426
  • 7.10本章小结431
  • 第8章并发集合框架432
  • 8.1集合框架结构432
  • 8.1.1接口Iterable432
  • 8.1.2接口Collection432
  • 8.1.3接口List433
  • 8.1.4接口Set434
  • 8.1.5接口Queue435
  • 8.1.6接口Deque435
  • 8.2非阻塞队列435
  • 8.2.1类ConcurrentHashMap的使用436
  • 8.2.2类ConcurrentSkipListMap的使用442
  • 8.2.3类ConcurrentSkipListSet的使用444
  • 8.2.4类ConcurrentLinkedQueue的使用447
  • 8.2.5类ConcurrentLinkedDeque的使用451
  • 8.2.6类CopyOnWriteArrayList的使用453
  • 8.2.7类CopyOnWriteArraySet的使用454
  • 8.3阻塞队列456
  • 8.3.1类ArrayBlockingQueue与公平/非公平锁的使用456
  • 8.3.2类PriorityBlockingQueue的使用461
  • 8.3.3类LinkedBlockingQueue的使用463
  • 8.3.4类LinkedBlockingDeque的使用463
  • 8.3.5类SynchronousQueue的使用463
  • 8.3.6类DelayQueue的使用466
  • 8.3.7类LinkedTransferQueue的使用467
  • 8.4本章小结476
  • 第9章线程池类ThreadPoolExecutor的使用477
  • 9.1Executor接口介绍477
  • 9.2使用Executors工厂类创建线程池481
  • 9.2.1使用newCachedThreadPool()方法创建无界线程池481
  • 9.2.2验证newCachedThreadPool()方法创建线程池和线程复用特性483
  • 9.2.3使用newCachedThreadPool(ThreadFactory)方法定制线程工厂486
  • 9.2.4使用newCachedThread-Pool()方法创建无界线程池的缺点487
  • 9.2.5使用newFixedThreadPool(int)
  • 方法创建有界线程池488
  • 9.2.6使用newSingleThread-Executor()方法创建单一线程池490
  • 9.3ThreadPoolExecutor类的使用491
  • 9.3.1队列LinkedBlocking-Queue、ArrayBlocking-Queue和Synchronous-Queue的基本使用491
  • 9.3.2构造方法参数详解495
  • 9.3.3方法shutdown()和shutdownNow()521
  • 9.3.4方法Listshutdown-Now()返回值的作用525
  • 9.3.5方法shutdown()和shutdown-Now()与中断527
  • 9.3.6方法isShutdown()529
  • 9.3.7方法isTerminating()和isTerminated()530
  • 9.3.8方法awaitTermination(longtimeout,TimeUnitunit)531
  • 9.3.9工厂ThreadFactoryThreadUncaughtExceptionHandler处理异常533
  • 9.3.10方法set/getRejected-ExecutionHandler()537
  • 9.3.11方法allowsCoreThreadTime-Out和allowCoreThreadTime-Out(bool)539
  • 9.3.12方法prestartCoreThread()和prestartAllCoreThreads()541
  • 9.3.13方法getCompletedTask-Count()542
  • 9.3.14线程池ThreadPoolExecutor的拒绝策略543
  • 9.3.15方法afterExecute()和beforeExecute()549
  • 9.3.16方法remove(Runnable)的使用551
  • 9.3.17多个get方法的测试555
  • 9.4本章小结558
     

资源获取

相关资源

网友留言