java - 在这种情况下,同步语句如何工作?

标签 java multithreading concurrency synchronization synchronized

假设我有一个这样的类(class):

public class Server {

   public static void main(String[] args) {

      Map<Integer, ServerThread> registry = Collections.synchronizedMap(new LinkedHashMap<Integer, ServerThread>());

      ...

      while(true) {
         Socket socket = serverSocket.accept();
         ServerThread serverThread = new ServerThread(id, registry);
         registry.put(id, serverThread);
      }
   }
}

然后:

public class ServerThread extends Thread {

   private Map<Integer, ServerThread> registry;
   private int id;

   public ServerThread(int id, Map<Integer, ServerThread> registry) {
      this.id = id;
      this.registry = registry;
   }

   ...

   private void notify() {
      synchronized(registry) {
         for(ServerThread serverThread : registry.values()) {
            serverThread.callSomePublicMethodOnThread();
         }
      }      
   }
}

我只是想确保在迭代时 registry 不会被修改。使其成为同步映射可以保证这种行为吗?或者我是否需要 synchronized 语句。同步语句的行为会像我期望的那样吗?

谢谢

最佳答案

您需要循环周围的synchronized block 。

请参阅JavaDoc了解详情。

关于java - 在这种情况下,同步语句如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3887950/

相关文章:

c# - 如何通过 NHibernate 在聚合根中处理具有持久计算属性的并发?

java - 键盘 Action 监听器

java - JxBrowser 高效检索网站图标的策略

objective-c - 从在后台线程上执行的其他方法内部在主线程上执行方法?

WPF 相当于 Windows 窗体中的 'Control.CheckForIllegalCrossThreadCalls'

multithreading - 在网络 worker 中使用谷歌地图对象?

java - 具有非最终字段的不可变对象(immutable对象)如何成为线程不安全的?

java - 什么是构造try catch语句以仅允许整数的正确方法?

java - Java的Socket使用的是什么协议(protocol)?

java - java套接字连接被拒绝?