高并发主要组件:synchronizer / 同步容器 / ThreadPool、executor
volatile
volatile,一个可以使变量在多个线程中是可见的,当一个volatile修饰的值改变了,则会通知其他线程修改为最新的值,从而使多个线程之间一个变量的保持可见行,是一种无锁同步,但是只有可见性,没有原子性
synchronized锁
synchronized是如果是同一个锁对象,则是可以重入的锁,如:
- 同一个类的不同方法,可以持有同一把锁
- 父类的锁和子类的锁可以为持有同一把锁
因为锁定的为同一个对象子类的synchronized可以调用父类的synchronized方法,所以持有相同的锁
在线程中如果异常出现,则会自动释放锁,导致线程余下程序不是线程安全,需要慎重处理异常
synchronized可以保持原子性和可见性
作为锁的对象,属性可以变化,如果锁的对象发生变化,则也会变化,锁的是new的栈的对象,而不是引用,所以new新的对象,则会影响前一个对象的变化
不以字符串常量来作为锁的对象
原理主要是:JMM,包含主内存,线程内存之间的数据同步和原子的问题
对象锁为当前对象的锁,仅限于当前锁的方法和对象,无锁不受影响,但是可能存在脏读,应该枷锁保持一致性,多个锁的方法为同一把锁,则无需额外获取锁,当前锁即可调用
多线程之wait/notify:
- 先锁定对象,必须在synchronized
- 不满足条件就进入等待,并释放锁,等待锁的notify的方法,则执行
- 如果满足其他线程的条件,则调用notify唤醒其他线程,在调用自己的wait释放锁给其他线程先执行
不建议使用wait/notify
实现一个容器,一个线程插入一定的内容,另一个线程监控到一定数量时发出警报
1 | // wait/notify |
原子类型
简单的数字运算,采用Atomic*的类型
lock
必须手动释放锁,为可重入锁
1 | public class ReentrantLock1{ |