AsyncSendDispatcher 同步块synchronized问题
来源:9-13 消息分片设计与实现-发送调度-1
LillteZheng
2019-09-19
老师,为什么这里要单独新建一个 Object queueLock = new Object() ,然后再用 synchronized (queueLock) 去锁呢?直接 synchronized(this) 不也能防止多线程对该对象的访问和擦写吗?
写回答
1回答
-
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)
来也未尝不可~~
012019-09-23
相似问题