目录
一、调度(四)
1.随机调度大环境
随机调度大环境 里面有 锁竞争阻塞 ,里面又有 代码块的竞锁能力
二、锁(二)
1.位置
锁只在竞争中 跳跃存在着
2.无锁阻塞
竞争无锁处 被锁阻塞着
3.重入锁
线程重入锁 时 处运行态 、其它代码块被锁阻塞 无竞争 能高效地获取锁
4.连续锁
线程连续竞同锁 会因上把锁出时 还处运行态 较其他同锁竞争线程的 阻塞刚唤醒态 容易连续调度 去竞争到同锁
4.1措施
可在上把锁 用wait后移 消除连续调度竞争 而++避免造成 线程饿死++
三、线程方法(二)
1.wait
锁的wait方法 对身竞争代码块 停位地 封印其竞锁能力,便也失去了锁,处于无法参与竞争的 永阻塞状态
- wait(时间)设置最长等待时间 后自动唤醒
2.notify
锁的notify方法 对异竞争代码块 续位地 恢复其竞锁能力,在瞬时间内 处回可参与竞争的 现阻塞状态
- notify 随机唤醒一个 此锁wait线程,notifyAll 唤醒所有此锁wait线程
3.wait-notify指位后移
锁的wait方法 将身线程wait后部分 阻塞往后放到 异线程锁noity方法的后面,应用案例:
3.1可能时再检查
循环连续的wait阻塞 等着只为每次可能情况时 再notify对接 来唤醒检查一下 ,提高了检查的情况针对性
3.1.1join(二)
join使当前线程 执行卡在该方法 直到该线程实例的系统线程死亡 才执行完退出来 ,将当前线程后部分 阻塞往后放到 目标系统线程死亡的后面
3.1.1.1可能时再检查死亡
++系统线程 销毁死亡++ 后,对应的++线程实例 会自动调用notifyAll++ ,所以就可以针对线程实例notify时 才对线程进行死亡检查:
java
public final synchronized void join(long millis) throws InterruptedException {
while (this.isAlive()) {
wait(millis);
}
}
四、单例模式
1.实现
1.1private构造器
private向外 封闭构造器 无法外部创建实例
1.2一次一个
内部只创建一次一个
1.3静态存储
放静态中 外部才可 对类的仅静态取出
2.样式
2.1饿汉模式
必创建地 类加载时就创建实例**:**
java
class SingletonHungry {
private static SingletonHungry instance = new SingletonHungry();//static静态存储,只有类加载时的创建一次一个
private SingletonHungry() {}//private封闭构造器
public static SingletonHungry getInstance() {//封装好获取
return instance;
}
}
2.2懒汉模式
需要时 才调用接口去创建实例:
java
class SingletonLazy {
private static SingletonLazy instance = null;//static静态存储
private SingletonLazy() {}//private封闭构造器
public static SingletonLazy getInstance() {
if (instance == null) { //优化时 线程不加锁能过(只读)情况 就拎开 少加点锁 分开处理掉
synchronized (SingletonLazy.class) {//写的这块范围内 线程安全问题保障:
if (instance == null) {//->连续读取instance的null时,两次没有前后影响到 都读为null 都去创建实例
instance = new SingletonLazy();
}
return instance;
}
}
return instance;
}
}
