java - Java 同步方法入口点线程是否足够安全?

标签 java multithreading concurrency thread-safety shared-resource

我有一个 Singleton 类处理一种在 Hashmap 中具有不同对象的缓存。 (键的格式直接链接到映射中存储的对象类型 - 因此映射是 )

可以在 map 上执行三种不同的操作:添加、获取、删除。

我使用公共(public)入口点方法(无密集访问)保护对 map 的访问:

public synchronized Object doAction(String actionType, String key, Object data){
  Object myObj = null;
  if (actionType.equalsIgnorecase("ADD"){
    addDataToMyMap(key,data);
  } else if (actionType.equalsIgnorecase("GET"){
    myObj = getDataFromMyMap(key);
  } else if (actionType.equalsIgnorecase("REM"){  
    removeDataFromMyMap(key);      
  }
  return myObj;
}

注意事项:

map 是私有(private)的。方法 addDataToMyMap()、getDataFromMyMap() 和 removeDataFromMyMap() 是私有(private)的。只有入口点方法是公共(public)的,除了类本身的静态 getInstance() 之外别无其他。

您是否确认并发访问 map 是线程安全的,因为除了通过该方法没有其他方法可以使用 map ?

如果它对于 map 来说是安全的,我想这个原则可以应用于任何其他类型的共享资源。

非常感谢您的回答。

大卫

最佳答案

我需要查看您对方法的实现,但这已经足够了。 但是我建议您使用 Java 的 Collection API 中的 Map,这样您就不需要同步您的方法,除非您共享其他一些实例。

阅读:http://www.java-examples.com/get-synchronized-map-java-hashmap-example

关于java - Java 同步方法入口点线程是否足够安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11472276/

相关文章:

java - 从另一个 Maven 存储库 Artifact 中获取所有 hibernate 注释/实体

java - 指定端口时,Spring Boot Actuator 端点的单元测试不起作用

c# - 在进程或线程之间划分工作?

MySQL INSERT SELECT WHERE 竞争条件

java - 如何获取整数输入的最后一个数字

C#线程安全代码

multithreading - "Holding"内存中的数据映射

java - 试图理解同步队列的机制

java - 在动态线程号中调用 ExecutorService.shutdown

Java - 逐行 'debug report'