中间变量
比第一种好 出现不一致性概率小,方法完成前读到脏数据概率小
哲学家问题
死锁:两把锁 在锁定一把的时候等待另外一把锁
解决方案:
- 两把锁合并成一把锁(锁的粗化)
- 混进一个左撇子
if (index ==0){
sync(right){
sync(left){
}
}
}else{
sync(left){
sync(right){
}
}
}
- 效率更高的写法,奇数偶数分开,混进一半的左撇子(index%2==0)
交替输出问题
- Locksupport 交替执行park当前线程阻塞(停止)内部做的标记
- TransferQueue 容量为0的队列
new Thread(()->{
synchronized(o){
for(char c:aI){
System.out.print(c);
try{
o.notify();
o.wait();//让出锁
}catch(InterruptedException e){
e.printStackTrace();
}
}
o.notify();//必须,否则无法停止程序
}
},"t1").start();
new Thread(()->{
synchronized(o){//当成一把锁来使用 当前线程关联的等待队列
for(char c:aC){
System.out.print(c);
try{
o.notify();
o.wait();//让出锁
}catch(InterruptedException e){
e.printStackTrace();
}
}
o.notify();//必须,否则无法停止程序
}
},"t2").start();
- countDownLatch 先await
- Lock ReentrantLock await signal
condition理解为一个队列lock.newCondition();
生产者消费者问题 ReentantLock Condition
lock.lock();
try{
while(count>=maxNum){
producerCondition.awati();
System.out.println("生产能力上限,等待");
}
count++;
System.out.println(Thread.currentThread().getName()
+"生产者生产,目前有"+count);
//唤醒消费者
consumerCondition.signalAll();
}catch(){}finally{
lock.unlock();
}
异步回调回滚问题(分布式事务)
大任务分解成小任务,出错回滚问题(分布式事务)
管理器监听 自己callback回滚
底层同步问题(乱序和屏障的问题)
- cpu存在乱序执行
ALU CPU内部运算单元 访问寄存器的速度,比访问内存的速度快100倍
DCL单例需不需要voliate 旧的需要 新的不需要已优化