AsyncSendDispatcher 同步块synchronized问题

来源:9-13 消息分片设计与实现-发送调度-1

LillteZheng

2019-09-19

老师,为什么这里要单独新建一个 Object queueLock = new Object() ,然后再用 synchronized (queueLock) 去锁呢?直接 synchronized(this) 不也能防止多线程对该对象的访问和擦写吗?

写回答

1回答

Qiujuer

2019-09-20

synchronized(this)

也是可以做到你说的这样的哈,不过单独的建立一个Object queueLock = new Object() 的目的在于更加细粒度的区分业务。

在实际的业务中,如果你在一个类中有多个独立的队列或者其他需要同步的块,那么我建议都使用:
Object queueLock = new Object() 

的方式来独立控制,如果直接使用synchronized(this)则会让你的所有的同步块都是 this,那么当你访问A的时候进入锁,对于访问B的来说也需要等待来。

如果使用多个Object queueLock = new Object() 区分开来,这样可以保证多个线程同步访问A的时候进入A的锁等待,但是不妨碍操作B,因为操作B是访问B的锁了。


当然上述来说都是一些小建议,如果你的同步块有A、B、C三个;而A\B本身是final的,那么可以不用新建:
Object AqueueLock = new Object() 而直接使用synchronized(A)、synchronized(B)即可。

在实际的开发中可以灵活的根据场景来判断即可,如果你就是要整个类都保持同一个锁,那就使用

synchronized(this)

来也未尝不可~~

0
1
LillteZheng
非常感谢!
2019-09-23
共1条回复

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2316 学习 · 476 问题

查看课程