synchronized
synchronized 的修饰对象
- 静态方法 获得本类对象
- 方法 本实例对象
- 代码块: 可以指定锁对象
原理
当程序执行到synchronized 修饰段的时候,线程会尝试获取它的监视器对象
如果监视器进入数为0 则该线程获得监视器,然后设置进入树为1 可重入
如果monitor 对象已经被其他线程获取,则该线程进入阻塞状态,直到monitor 进入数为0
wait notify
wait 和 notify 就是一个暂停运行 一个通知运行,当时必须获得锁以后才可以执行该对象,而且获得的锁必须是相同的锁机制。
锁的原理也是获得监控器的对象,
wait 立刻释放锁
notify 一次只唤醒一个线程且唤醒的顺序和执行wait方法的顺序一致
volatile 关键字
保证可见性
不保证原子性
禁止指令重排
守护进程和用户进程
用户进程就是用户创建的进程
不需要上乘逻辑介入
主线程结束 自动结束
普通线程是一直run 完 可能
阻塞队列
普通阻塞队列
数组阻塞队列
一旦指定了队列的长度,则队列的大小不能改变 先进先出 数组实现
列表阻塞队列
先进先出 可以设置有限也可以设置无限
优先阻塞队列
插入的对象必须可以比较的
异步阻塞队列
put 必须等待take take也必须等待put
lock 和 synchronized 的区别
lock 是一个类 发送异常不会释放锁
synchoronized 不会释放锁
线程池
线程池的配置
CPU 密集性 +1
IO密集型 CPU/(1-阻塞系数)
线程池的参数
核心线程数
最大线程数
存活时间
存活时间单位
任务队列
线程工厂
拒绝策略
拒绝策略比如不管什么情况直接抛出异常
或者任何处理继续运行
线程池的创建
1.newCachedThreadPool创建一个可缓存线程池程
2.newFixedThreadPool 创建一个定长线程池
3.newScheduledThreadPool 创建一个定长线程池
4.newSingleThreadExecutor 创建一个单线程化的线程池
锁机制
公平锁就是按申请顺序执行
非公平锁就是部分优先级高的可以加塞
可重入锁就是进入锁内部仍然可以获得该锁
不停地空耗CPU
中心锁默认是非公平的
乐观锁默认操作不会修改数据 使用CAS
悲观锁默认会修改数据 使用Synchronized
在对记录进行修改前,先尝试为该记录加上排他锁(exclusive locks)。
如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常。具体响应方式由开发者根据实际需要决定。
如果成功加锁,那么就可以对记录做修改,事务完成后就会解锁了。
期间如果有其他对该记录做修改或加排他锁的操作,都会等待解锁或直接抛出异常。
死锁
死锁预防是添加某种限制条件
比如设定某线程必须在另一个线程全部执行完之后才能执行
sleep yeild
①sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;
③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。