《Java多线程编程核心技术》读书笔记
2016-05-02 16:44
295 查看
《Java多线程编程核心技术》读书笔记。
###第一章 Java多线程技能使用Java多线程两种方式。
继承Thread类与实现Runnable接口。
线程的开始、中止、暂停、恢复、停止。
start()、
interrupt()、
suspend()、
resume()、
stop()
线程的
id、
name、优先级
priority、守护
daemon。
线程的
id由内部自增字段维护,默认的
name也是如此。优先级
priority没有强迫性。
deamon表示本线程是否守护主线程。
线程的
sleep、
yield、
wait区别。
sleep不释放锁,不放弃当前CPU资源。
yield不释放锁,放弃CPU资源。
wait是释放锁,并放弃CPU资源。
线程跳出执行的方法。
可使用“异常法”,在同步代码中根据线程是否
interrupted,抛出异常,这样中断的消息可以有调用栈中传递。
###第二章 对象及变量的并发访问
synchronized同步方法与同步代码块。
同步方法与同步代码块类似,锁定的是
this对象。
锁同步对象为实例与类的区别。
实例对象锁定的是实例对象,类锁定的是类对象。
String为锁的特性。
String对象有常量池,所有锁定同一个字面量的
String对象,是同一个对象锁。
synchronized与
volatile。
volatile主要作用是使变量在多线程间可见。而
synchronized是保证多线程的同步性,同时有也有可见性。
volatile的非原子性。
volatile不具备同步性,也不具备原子性。
Atomic相关类。
相关类保证了原子性,但是没有同步性,类的每个方法之间调用不是原子性的。
同步方法的非继承、异常自释放,脏读。
同步方法不会继承同步性,出现异常会自动释放锁,在多线程情况下,可能会读到已经被修改的值。
###第三章 线程间通信
Object中等待与通知的锁模型。
调用
wait()方法,当前线程释放锁,会在
wait()代码停止执行,直到中断或接到通知。调用
notify()方法会在线程退出同步体后释放锁,并通知其他在等待对象锁的线程。
生产者与消费者模式。
管道进行线程通信。
通过字节流与字符流也可用于不同线程之前的通信。
Thread中
join方法实现机制。
使用
join()可以让主线程等待子线程执行完成之前再结束。内部实现机制是让主线程的进入子线程的
join()方法,然后等待。因为
join()是同步方法,没人通知,所以会无限期阻塞,直到子线程销毁。
ThreadLocal线程隔离的实现机制。
ThreadLocal可以让线程持有线程独有的变量,内部原理是
Thread类中有一个
Map,存储着所有
ThreadLocal变量,以
ThreadLocal字段实例为
Key。所有不同的线程会有不同的
ThreadLocal变量值。
第四章 Lock的使用
ReentrantLock与
synchronized的对比。
lock()与
unlock()方法对对应
synchoronized的同步区。
Condition与
Object中的锁模型对比。
await()对应
wait(),
signal()/signalAll()对应
notify()/notifyAll()。
公平锁与非公平锁。
公平锁表示获取锁是按加锁的顺序分配的,也就是FIFO,非公平锁就是按随机获取。
tryLock()、
awaitUntil()等独有方法。
tryLock()作用是只有在没其他线程持锁的情况才去获取锁。
awaitUntil()是指等待到某个时间点。
ReentrantReadWriteLock的读写排斥规则。
读写锁的规则是读读共享,写写互斥,读写互斥,写读互斥。
第五章 定时器 Timmer
定时器过期调度规则。当计划时间早于当前时间时,定时器会立刻执行,如果晚于当前时间,会等待到计划时间再执行。
scheduleAtFixedRate()的间隔时间规则与过期补偿调度。
scheduleAtFixedRate()与
schedule()方法不同,一是在计算下次执行时间,后者是本次任务的开始时间+时间间隔得出,前者是使用严格按初始时间+时间间隔得出,所以当前时间比计划时间要晚的时间,调试器会“补上”从初始时间到当前时间没有执行的任务。
第六章 单例模式与多线程
六种单例模式。有经典饿汉模式、静态代码块模式、静态内部类模式、枚举模式、经典懒汉模式、DCL同步代码模式。
懒汉模式与可能出现的同步问题及解决方法。
懒汉模式就是延迟加载,但在多线程情景下,可能会出现多个实例。可以使用
synchronized同步方法,或者用双重检查锁机制解决这个问题。
第七章 拾遗增补
线程六种状态,和状态之间的转换。线程有
NEW、
RUNNABLE、
BOLOCKED、
WAITING、
TIMED_WAITING、
TERMINATED六种状态。
线程组相关知识:自动归属、多级关联、停止等。
当线程创建时,如果没有指定所属线程组,他会自动归属到当前线程所在的线程组。线程组之前可以多级关联形成线程树。
线程与线程组异常处理。
线程与线程组可使用
UncaughtExceptionHandler与
uncaughtException处理相关的异常,不必在
run()中处理。如果
run()中有
try-catch,
uncaughtException就不会被调用。
相关文章推荐
- Java InputStream、String、File相互转化
- java中Static&Final的使用方法,&&&Java中两个主要的抽象Abstract&&Implement
- Google Java编码规范
- maven+springmvc+easyui+fastjson+pagehelper
- RandomAccessFile类
- spring boot 异常处理
- 华为Java编程规范
- Java 多线程编程学习(一)
- Maven——Java项目构建工具
- 对象流
- 安卓开发之java基础笔记【6】
- 内存流
- Javastring类
- system.in的用法,system.out的用法。
- Java日期类
- Java 方法
- Java中的Socket通信(一)Socket介绍
- 20160501--struts2入门3
- Java---类反射(2)---类反射加强
- Java---类反射(2)---类反射加强