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”对象(并使它们成为私有对象)是更好的方法。非常好的响应,正是我所想的。非常感谢您的澄清!