您的位置:首页 > 编程语言 > Java开发

《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
就不会被调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: