Java中的同步帮助
看看,我似乎不明白为什么在同步方法中需要有一个同步块,如下所示:Java中的同步帮助,java,jetty,synchronized,multithreading,Java,Jetty,Synchronized,Multithreading,看看,我似乎不明白为什么在同步方法中需要有一个同步块,如下所示: private synchronized void chat(HttpServletRequest request,HttpServletResponse response,String username,String message) throws IOException { Map<String,Member> room=_rooms.get(request.getPathInfo()); if (
private synchronized void chat(HttpServletRequest request,HttpServletResponse response,String username,String message)
throws IOException
{
Map<String,Member> room=_rooms.get(request.getPathInfo());
if (room!=null)
{
// Post chat to all members
for (Member m:room.values())
{
synchronized (m)
{
m._queue.add(username); // from
m._queue.add(message); // chat
// wakeup member if polling
if (m._continuation!=null)
{
m._continuation.resume();
m._continuation=null;
}
}
}
}
private synchronized void chat(HttpServletRequest请求、HttpServletResponse响应、字符串用户名、字符串消息)
抛出IOException
{
Map room=_rooms.get(request.getPathInfo());
如果(房间!=null)
{
//向所有成员发布聊天记录
对于(成员m:room.values())
{
同步(m)
{
m、 _queue.add(用户名);//来自
m、 _queue.add(message);//聊天
//如果轮询,则唤醒成员
如果(m._continuation!=null)
{
m、 _continuation.resume();
m、 _continuation=null;
}
}
}
}
如果整个方法已经是线程安全的,m
为什么需要同步(再次?)
感谢您的帮助。同步方法“chat(…)”在其实例对象上同步,而同步方法(m)在“m”上同步对象-因此它们在两个不同的对象上进行同步。基本上,这是为了确保其他servlet对象不会同时与同一成员实例发生冲突。当整个方法同步时,会在
此
对象上获得锁。但同步块仅在当前待同步的成员上获得锁迭代中使用的同步。同步在不同的锁上
方法定义中的synchronized
关键字表示在上同步的其他代码不能与方法并行运行
已同步(m)
scope意味着在m
上同步的其他代码不能与循环并行运行。谢谢,我理解,但只是出于好奇。_-rooms对象为什么不同步?可能是因为_-rooms仅由同一类中的其他同步方法修改,所以只要您在同步的类中访问它方法,您可以确保没有其他人向其添加或从中删除项。理想情况下,它将被定义为“private”,因为现在它是包private,表示包中的任何其他类(或子类)可以访问它。谢谢你的评论,但是我需要回到我原来的问题。为什么需要同步“m”呢?它只在已经同步的方法中使用(很像_rooms)。或者同步“m”只是一种预防措施吗?我不太熟悉这个类,甚至不太熟悉它演示的Jetty Continuations,但我认为没有必要在servlet实例(在方法级别)和成员对象上同步。同步所有方法可能“更安全”但是,当多个客户端同时访问servlet时,它也存在不必要的阻塞风险。我认为只同步“room”和“member”对象(并使它们成为私有对象)是更好的方法。非常好的响应,正是我所想的。非常感谢您的澄清!