基于SF现场反馈关于阻塞问题总结
包含大数据量的 数据集or任务or项目在做审批同意操作时耗时比较长影响其他用户的操作(数据提交,数据审核,任务启动,重启。。。。。)
经跟进原因是因为执行审批流程推进时有用到synchronized修饰的方法并在方法内循环操作数据 对锁的占用时间较长 导致其他操作时线程无法进入该方法形成线程阻塞!
解决方案
将加synchronized修饰方法里的for循环摘出减少同步逻辑处理缩短线程对锁的占用时间
synchronized的实现原理
所有对象都自动含有单一的锁(监视器),当在对象上调用其任意synchronized 方法的时候,此对象都被加锁。对于某个特定对象来说,其所有synchronized方法共享同一个锁,这可以被用来防止多个任务同时访问被编码为对象内存。
当一个线程访问类的一个synchronized 修饰的同步方法时,它就获得了这个当前类的对象锁。这时其它线程对该类的所有同步方法的访问都会形成阻塞,它有两种用法:synchronized 方法和 synchronized 块。
synchronized 方法:
public synchronized void startActivity (int n){
};
特定对象所有synchronized方法共享同一个锁,这种机制确保了同一时刻对于每一个类实例,
其所有声明为 synchronized 的成员函数中最多只有一个处于可执行状态(因为最多只有一个能够获得该类实例对应的锁)。
synchronized 块是可以将同步代码放到代码块中当前线程执行完代码块时锁就被释放了对锁的获取/释放相对灵活:
synchronized(SyncObject.Class) {
//允许访问控制的代码
}
亦可写成如下格式,this,指的就是当前这个类也可以写成其他类或实例
synchronized(this) {
//允许访问控制的代码
}