《Java多线程核心技术》读书摘要
Chapter1:
进程是操作系统管理的基本单元,线程是CPU调到的基本单元。
调用myThread.run()方法,JVM不会生成新的线程,myThread.start()方法调用两次JVM会报错。
myThread.start() happen-before 于线程的每一个动作(《JVM高级特性与最佳实践》P376)
sleep(int t)方法是Thread类的方法,让this.currentThread()在t ms内休眠,不释放琐。
线程的停止有三个方法:
①thread.stop()对于某些非原子操作会造成数据不一致
②try catch+InterruptException+thread.interrupt()(推荐)
③设置flag
suspend()和resume()可以暂停/恢复,但是suspend()不会释放锁,某些非原子操作不同步。
线程的优先级是映射到操作系统中的,具有继承特点,CPU优先调用高优先级的线程,但不代表高优先级线程先执行完再执行低优先级线程。
守护线程:当进程中不存在非守护线程了,守护线程就会自动销毁,典型的守护线程是垃圾回收线程。
Chapter2:
局部变量线程安全、实例变量和静态变量非线程安全。
A线程持有object对象的Lock琐的时候,B线程可以以异步的方式调用object对象的非synchronize类型方法,但进入object对象的synchronize方法需等待
synchronize拥有琐重入功能:ThreadA获取了一个对象锁之后,再次请求该对象锁时是可以再次得到该对象的琐的,同时子类可以通过可重入琐调用父类的同步方法。
当一个线程执行的代码出现异常时,其所持有的琐会释放
继承关系时,父方法同步,子方法不同步。
synchronize同步块可以解决同步方法耗时太长的问题,synchronize(this)同步块和同步方法用的是用同一个对象锁。
synchronize static 方法加锁 = synchronize(object.class)是Class琐。
由于JVM具有String常量池缓存功能,大多数情况下synchronize代码块都不以String作为对象锁。
volatile关键字只能修饰变量,具有可见性,不具有原子性。
Chapter3:
调用wait()之前,线程一定要获取琐,故一定要放在synchronize语句中,由于会抛出InterruptException异常,所以需要放到try-catch块里,notify()通知的线程由JVM决定
必须执行完notify()所在的同步synchronized代码块之后才能释放锁。
进程间通信,pipeStream
join()遇到interrupt()方法之后会抛出异常。,join()内部使用wait()方法,因此会释放锁。
ThreadLocal可以保证线程的隔离性,不同Thread只能get到自己的ThreadLocal的值;InheritableThreadLocal会逐级继承父类的ThreadLocal
Chapter4:
Lock+Condition
ReentrantLock
ReentreantReadLock
Chapter5:
Timer不是守护线程
Chapter6:
单例模式
Chapter7:
线程的状态