###第一章 Java多线程技能编程
使用Java多线程两种方式。
继承Thread类与实现Runnable接口。多线程
线程的开始、停止、暂停、恢复、中止。
start()
、interrupt()
、suspend()
、resume()
、stop()
并发
线程的id
、name
、优先级priority
、守护daemon
。
线程的id
由内部自增字段维护,默认的name
也是如此。优先级priority
没有强迫性。deamon
表示本线程是否守护主线程。this
线程的sleep
、yield
、wait
区别。
sleep
不释放锁,不放弃当前CPU资源。yield
不释放锁,放弃CPU资源。wait
是释放锁,并放弃CPU资源。线程
线程跳出执行的方法。
可以使用“异常法”,在同步代码中根据线程是否interrupted
,抛出异常,这样中断的消息能够有调用栈中传递。调试
###第二章 对象及变量的并发访问code
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
变量值。
ReentrantLock
与synchronized
的对比。
lock()
与unlock()
方法对对应synchoronized
的同步区。
Condition
与Object
中的锁模型对比。
await()
对应wait()
,signal()/signalAll()
对应notify()/notifyAll()
。
公平锁与非公平锁。
公平锁表示获取锁是按加锁的顺序分配的,也就是FIFO,非公平锁就是按随机获取。
tryLock()
、awaitUntil()
等独有方法。
tryLock()
做用是只有在没其余线程持锁的状况才去获取锁。awaitUntil()
是指等待到某个时间点。
ReentrantReadWriteLock
的读写排斥规则。
读写锁的规则是读读共享,写写互斥,读写互斥,写读互斥。
定时器过时调度规则。
当计划时间早于当前时间时,定时器会马上执行,若是晚于当前时间,会等待到计划时间再执行。
scheduleAtFixedRate()
的间隔时间规则与过时补偿调度。
scheduleAtFixedRate()
与schedule()
方法不一样,一是在计算下次执行时间,后者是本次任务的开始时间+时间间隔得出,前者是使用严格按初始时间+时间间隔得出,因此当前时间比计划时间要晚的时间,调试器会“补上”从初始时间到当前时间没有执行的任务。
六种单例模式。
有经典饿汉模式、静态代码块模式、静态内部类模式、枚举模式、经典懒汉模式、DCL同步代码模式。
懒汉模式与可能出现的同步问题及解决方法。
懒汉模式就是延迟加载,但在多线程情景下,可能会出现多个实例。可使用synchronized
同步方法,或者用双重检查锁机制解决这个问题。
线程六种状态,和状态之间的转换。
线程有NEW
、RUNNABLE
、BOLOCKED
、WAITING
、TIMED_WAITING
、TERMINATED
六种状态。
线程组相关知识:自动归属、多级关联、中止等。
当线程建立时,若是没有指定所属线程组,他会自动归属到当前线程所在的线程组。线程组以前能够多级关联造成线程树。
线程与线程组异常处理。
线程与线程组可以使用UncaughtExceptionHandler
与uncaughtException
处理相关的异常,没必要在run()
中处理。若是run()
中有try-catch
,uncaughtException
就不会被调用。