synchronized修饰的代码块中为什么不能调用rpc

msgyg 发布于 2018/12/20 09:29
阅读 121
收藏 1

synchronized修饰的代码块中为什么不能调用rpc?求大神赐教,可能是我对 synchronized的理解不够透彻,所以没有理解,请理解的朋友说明一下,谢谢

加载中
0
yongk
yongk

确切的说,是synchronized修饰的代码块中不应该有阻塞、长时间任务的调用。比如sleep(),数据库调用,同步rpc,大量的计算。时间越长的任务,占用独占锁的时间就越长,阻塞其他线程的时间就越长,被阻塞线程不能进行其他计算,浪费了计算资源,降低了吞吐量。

这个就像每年国庆的高速入口堵车,车就相当于线程,车运行相当于线程被调度运行,车停止相当于线程阻塞。人工取卡慢,堵的队伍很长,后面的车不能前进也不能后退,线程阻塞。而ETC通过时间快,后面的车只有稍微的阻塞停顿就通过了,线程就可以继续后续的任务了。

0
msgyg
msgyg

引用来自“yongk”的评论

确切的说,是synchronized修饰的代码块中不应该有阻塞、长时间任务的调用。比如sleep(),数据库调用,同步rpc,大量的计算。时间越长的任务,占用独占锁的时间就越长,阻塞其他线程的时间就越长,被阻塞线程不能进行其他计算,浪费了计算资源,降低了吞吐量。

这个就像每年国庆的高速入口堵车,车就相当于线程,车运行相当于线程被调度运行,车停止相当于线程阻塞。人工取卡慢,堵的队伍很长,后面的车不能前进也不能后退,线程阻塞。而ETC通过时间快,后面的车只有稍微的阻塞停顿就通过了,线程就可以继续后续的任务了。

谢谢

返回顶部
顶部