个人系统读完《Java多线程编程核心技术》后的总结记录,不对正确性负责^_^
实现多线程的方法
- 继承Thread类(不支持多继承)
- 实现Runnable接口(支持多继承)
停止线程
使用interrupt()方法,给线程打上停止标记,在线程内部通过isInterrupted()判断线程是否是停止状态,通过throw new InterruptedException()抛出异常,停止线程。
synchronized
- 线程A先持有object对象的lock锁,线程B可以异步调用object对象中的非synchronized类型方法,如果调用synchronized方法,则需等待A释放锁。
- 锁重入,在一个synchronized方法/块的内部调用本类的其他synchronized方法/块,是永远可以得到锁的。
- synchronized声明方法,可能会让其他线程等待比较长的时间,可以通过synchronized同步语句块解决。
- synchronized方法是对当前对象加锁,而synchronized代码块,则是对某一对象加锁,根据传参判断。
volatile
主要作用是使变量在多个线程间可见。强制从公共堆栈取得变量值而不是从线程私有数据栈中取得变量值。
join
- 使用场景:主线程创建子线程,如果子线程要进行大量的耗时运算,主线程往往早于子线程之前结束。使用join()可以等待线程对象销毁。
- 使所属线程对象x正常执行run()方法中的任务,而当前线程z进行无限期的阻塞,等待线程x销毁后再继续执行线程z之后的代码。
- join(long)的底层是使用wait(long)实现,会释放锁,而sleep(long)不会释放锁。
ThreadLocal
主要解决变量在不同线程之间隔离性,即让不同的线程拥有自己的值。
Lock
调用lock.lock()代码的线程就持有了“对象监视器”,其他线程只有等待锁被释放时再次争抢,效果同synchronized。
Condition
- 一个Lock对象里可以创建多个Condition(即对象监视器)实例。线程对象可以注册在指定的Condition中,实现有选择性的线程通知。
使用notify()/notifyAll()方法,被通知的线程是由JVM随机选择/全部通知。
Condition通过await()和signal()/signalAll()方法实现等待和通知。
公平锁与非公平锁
- 公平锁是线程获取锁的顺序是按照线程加锁的顺序来分配。
- 非公平锁是一种获取锁的抢占机制,随机获得锁,可能造成某些线程一直拿不到锁。
读写锁
- 共享锁,读操作相关
- 排他锁,写操作相关
多个读锁之间不互斥,读锁和写锁互斥,写锁和写锁互斥。