《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