《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:

线程的状态

 

posted @ 2016-07-12 16:29  TonyLuis  阅读(200)  评论(0编辑  收藏  举报