@多线程高并发
进程、线程的概念
- 进程:可以简单的理解为一个可以独立运行的程序单位,它是线程的集合,进程就是有一个或多个线程构成的。
- 线程:一个程序有不同的执行路径就叫做一个线程。
创建线程的方法
常用的方法
- Sleep() 睡眠
- yeild() 让出一下cpu
- join() 等待另一个线程的结束
线程状态
- New
- Runnable Ready ------线程被调度器选中执行------->Running
- ThreadWaiting
- Waiting
- Blocked 等待进入同步代码块的锁
-Terminated
锁升级的概念
sync(Object)
markword 记录线程id(偏向锁)
如果发生线程争用,升级为 自旋锁
默认旋10次,如果还得不到锁,就升级为重量级锁-OS
执行时间长(加锁代码),线程数比较多,尽量用系统锁,即sync
执行时间短,线程数少,用自旋锁
锁只能升级不能降级
等待中的锁是不占用CPU的
线程同步
- synchronized(Object)
不能用String常量 Integer Long - 锁的是对象不是代码
- this xx.class(static方法前加synchronized,类似于锁定当前类)
- 锁定方法 非锁定方法 同时进行
- 锁升级的概念
偏向锁 自旋锁 重量级锁
-synchronized必须是可重入锁,锁的是同一个对象,否则会造成死锁。
程序中如果出现异常锁,默认情况下是会被释放的。有异常的情况要多加小心,会出现数据不一致的情况。
volatile
- 保证线程的可见性
MESI
缓存一致性协议 - 禁止指令重排序(CPU)
- DCL单例