当前位置: 首页 > 面试题库 >

线程安全哈希图?

刘弘济
2023-03-14
问题内容

我正在编写一个将HashMap返回给用户的应用程序。用户将获得对此MAP的引用。在后端,我将运行一些线程来更新Map。

到目前为止我做了什么?

我已经使所有后端线程都共享一个公用通道来更新MAP。因此,在后端,我确信并发写入操作不会成为问题。

我遇到的问题

  1. 如果用户尝试更新MAP并同时在后端更新MAP->并发写入操作问题。
  2. 如果使用尝试从MAP读取某些内容,同时MAP正在后端更新->并发READ和WRITE操作问题。

到目前为止,我还没有遇到任何此类问题,但是我担心将来可能会遇到。请提出建议。

我在用 ConcurrentHashMap<String, String>.


问题答案:

您使用会在正确的轨道上ConcurrentHashMap。对于每个点:

  1. 退房的方法putIfAbsentreplace无一不是线程安全的,并结合检查的HashMap的当前状态,并更新到一个原子操作。
  2. 该GET方法是不是内部同步,但会指定键可返回最近的值给它(检查讨论的ConcurrentHashMap类的Javadoc)。

ConcurrentHashMap与之类似的好处是,诸如之类Collections.synchronizedMap的组合方法以内部同步的方式putIfAbsent提供了传统的Map
getput逻辑。使用这些方法, 不要
尝试提供自己的自定义同步,ConcurrentHashMap因为它将无法正常工作。该java.util.concurrent集合被内部同步和其他线程不会在同步对象(例如,以努力作出响应synchronize(myConcurrentHashMap){}也不会妨碍其他线程)。



 类似资料:
  • 我在Java 7号工作。 我想知道方法在HashSet对象上是否是线程安全的。 散列集由一个线程初始化。然后我们用不可修改的集合()包装HashSet。初始化后,多个线程只调用方法。 当我阅读Javadoc时,它对我来说是不清楚的。 在HashSet Javadoc上,我们可以阅读 这个类实现Set接口,由一个哈希表(实际上是一个HashMap实例)支持。 ... 请注意,此实现不是同步的。 在H

  • 问题内容: 我通常使用bcrypt库进行密码哈希处理,但由于该库使用,因此无法这样做。我也尝试过scrypt。还有哪些其他方法是安全的,哪一种是最佳方法? 问题答案: 看看go.crypto。它提供对pbkdf2和bcrypt的支持。两种实现都是用Go编写的,并且可以在GAE上正常工作。 最简单的使用方法可能是bcrypt。要运行包: 用法示例: 输出将是这样的: 如果只需要哈希,请使用pbkdf

  • 问题内容: HttpUrlConnection线程安全吗?即,如果我有一个连接到服务器的HttpConnection实例,并且该实例被不同的线程使用(例如,尝试同时发送POST),HttpUrlConnection将如何处理这种情况?a)他们将串行发送POST,还是b)第一个线程发送POST,获取响应,然后第二个线程发送POST?如果它们以串行方式发送POST,则意味着到同一tcp连接的多个活动P

  • 假设我有一个Executors静态工厂方法的ExecutorService实例。 如果我从某个线程提交了一个调用,其中RetVal不是线程安全的本地实例化对象,那么当我从同一个线程获得()它时,我需要担心retvals的完整性吗?人们说局部变量是线程安全的,但我不确定当您返回一个本地实例化的对象并从其他线程接收它时,它是否适用。 下面是我的定制实现,我只是为了测试。您可以忽略EType枚举。

  • 在PHP初期,是作为单进程的CGI来运行的,所以并没有考虑线程安全问题。 我们可以随意的在全局作用域中设置变量并在程序中对他进行修改、访问,内核申请的资源如果没有正确的释放, 也会在CGI进程结束后自动地被清理干净。 后来,php被作为apache多进程模式下的一个模块运行,但是这仍然把php局限在一个进程里, 我们设置的全局变量,只要在每个请求之前将其正确的初始化,并在每个请求之后正确的清理干净

  • 我正在用一个字符串数组单维和一个2维int数组制作哈希表。我正在使用线性探测进行冲突检测,当我意识到如果检测到冲突,单词的hashCode将不再是索引时,我真的很兴奋地完成了这个程序。我该如何保存该索引以备以后使用?