基本概念
- 同步与异步
- 同步方法等待返回,异步方法立即返回
- 并发和并行
- 并行是两个任务同时进行,并发是两个任务切换执行
- 并发是交替的执行
- 并行是多个任务真实的同时执行
- 临界区
- 公共资源或者共享数据,可以被多个线程使用。但每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程想要使用这个资源就必须等待
- 阻塞和非阻塞
- 如果一个线程占用了临界区资源,其他的线程就得在这个临界区中等待,这就是阻塞;非阻塞强调没有一个线程可以妨碍其他线程执行
- 死锁、饥饿、活锁
- 死锁:两个及两个以上的进程互相等待,【哲学家进餐】;总是按照一个全局的固定顺序获取锁,可避免死锁
- 活锁:多个线程谦让导致无法使用资源
- 饥饿:某一个或多个线程一直占用资源,使其他需要资源的线程无法执行
- 并发级别
- 阻塞: 当一个线程进入临界区之后,其他线程必须等待
- 无饥饿:非公平锁会导致低优先级的线程饥饿,而公平锁饥饿就不会产生
- 无障碍:自由出入临界区,无竞争时有限步内完成操作,有竞争时回滚数据
- 无锁:无障碍,保证有一个线程可以胜出
- 无等待:无锁,要求所有线程都必须在有限步内完成,无饥饿
- JMM的特性
- Atomicity: 一个操作不可中断
- Visibility: 一个线程修改了某一个变量值,其他线程能否立即获取到这个改动值
- Ordering: 对于一个线程来说,它内部的执行顺序一定是一致的,多个线程之间涉及到指令重排,所以顺序是没有保障的
- Happen-before规则:指令重排的原则:
- 程序顺序原则:一个线程内保证语义的串行性
- volatile规则:volatile变量的写先发生于读,保证了volatile变量的可见性
- 锁规则:解锁必然发生在加锁前
- 传递性:A先于,B先于C,那么A一定先于C
- 线程的
start()
方法先于它的每一个动作 - 线程的所有操作先于线程的终结
- 线程的中断先于被中断线程的代码
- 对象的构造函数执行、结束先于
finalize()
方法
- synchronized的用法:
- 指定加锁对象
- 作用于实例方法