繁体   English   中英

使用Java的Hashtable进行互斥

[英]mutual exclusion using Hashtable of java

嗨,朋友,我班上有一个全局哈希表,还有两个与她一起工作的线程A和B。 从HashTable读取A,在Hashtable中写入B。是否存在互斥的问题? 我需要同步它还是Hashtable类是安全的?

HashtableMap接口的线程安全实现。

在常规的放置和获取操作中,您将很安全。 但是,当您在一个线程中对其进行迭代并从另一个线程修改其内容时,将遇到ConcurrentModificationException问题。 因此,迭代时,请确保迭代原始Hashtable的副本。

您应该改用ConcurrentHashMap ,它是java.util.Map接口的更好/更快的实现。

使用java集合提供的同步HashMap很有用。 此类是一个简单的包装器,并封装了hashmap:

Collections.synchronizedMap(new HashMap());

进一步的示例示例在java docs中: http : //docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.htmlsyncedMap

HashTable确保对其执行的任何操作都是原子的。 但是,如果要执行多个操作,则应该synchronize它们。 在下面的示例中,即使containsput是原子的,但代码具有check and act条件,因此您需要对此进行附加synchronization

    if(!hashtable.contains(Object))
    {
        hashtable.put(key, value);
    }

还要检查Collections.synchronizedMap()ConcurrentHashMap而不是HashTable

每个人都可以说些什么,但这只是对您所说的mutual exclusion补充。 您在问是否不会出现这样的问题。 线程安全程序必须确保,如果threadA使用的是一个代码块block1那么在该线程完成之前,其他线程将无法访问它。 因此,如果我很好地理解mutual exclusion含义,那么访问同一同步(线程安全)共享资源的线程是互斥的,因为它们都不能同时访问它。
如果选择建议的安全Map实现之一,Java实际上会为您带来很多困难。 现在,如果您的Hashtable(或您喜欢的其他任何线程安全的毛发)是共享资源,那么您唯一需要注意的就是before-before关系。 如果一个线程正在读取数据而另一线程正在写入数据,则将非常重要。
可以在Java并发教程Java并发包文档中找到更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM