lock();
try{
业务逻辑
} finally {
unlock()
}
这个应该是很多时候大家看的锁流程,今天去一家公司聊技术,整个过程就在问sychronized, 冲入锁、Java锁高级队列的时候等等,今天说点其他的:
- 什么时候解锁?
- 事务都没提交锁能释放么?
其实很多时候并发锁没卡住都是在不适当的时候提前释放了锁,如下代码多个并发同时执行就可能数据还没提交其他并发在unlock后拿到锁,就可能出现卡不住
beginTransaction()
beginTransaction()
lock(key="abc");
try{
业务逻辑
涉及多个系统为服务调用
设计多个Domain的Entity冲入修改
} finally {
unlock(key="abc")
}
commintTransaction()
其他为服务业务逻辑
commintTransaction()
实际情况可能比上面的例子更复杂,在Spring中其实有现成方案:
不过在GoLang中还没找到合适的解法,都没Spring完善