在java中,我的客户端有两个线程,一个是控制网络流量,另一个是处理消息,绘制游戏等。我试图做的是,当一个数据包到来时,网络线程将调用游戏线程的messageReceived方法,其中包含消息作为参数。如果我将函数messageReceived设置为同步,并且在messageReceived函数结束之前有2个数据包连续到达,是否会阻塞网络线程,或者由于网络线程无法调用已经被游戏线程使用的messageReceived函数而不阻塞,我的数据包丢失?
发布于 2013-05-04 01:49:00
当您使用synchronized关键字来同步代码段时,当另一个线程想要访问该段时,它将阻塞,直到它可以访问为止。
发布于 2013-05-04 01:50:29
正确,你阻塞了IO线程。正因为如此,您只想在messageReceived()上做简单的工作...也许只是在某种FIFO中对消息进行排队,以供处理线程稍后处理。您的同步块应该具有尽可能小的占用空间。
发布于 2013-05-04 01:50:49
如果线程调用类中的同步方法,则所有其他线程将被阻止调用该类中的任何同步方法,因为对象锁不可用。如果你的messageReceived没有在任何共享资源上工作,那么保持它的非同步。如果它正在使用一些共享资源,那么尝试通过将代码包装在同步块中来最小化同步代码。
https://stackoverflow.com/questions/16364793
复制相似问题