哈希表的线程安全性

时间:2011-08-11 08:36:57

标签: java hashtable

我有一个HashTable。

现在哈希表是线程安全的,所以每当我在哈希表中添加一些东西时也会安全吗?

例如

if hmp is my map

 hmp.get(0).add(something)

 hmp.get(0).remove(0)

这些操作是否安全?

2 个答案:

答案 0 :(得分:4)

不,绝对没有。散列表上各个操作的线程安全性不会影响将放入哈希表的内容的线程安全性。因此,如果您将一个ArrayList<T>引用放入哈希表,例如,那不是线程安全的,那么如果这些线程中的任何一个线程将修改数据,则不应在没有同步的情况下从多个线程中使用它。

答案 1 :(得分:-2)

   package legacyCLasses;
   import java.util.*;
   public class HashTable_With_Enumeration implements Runnable
   {
    Hashtable<Integer,String> htobj=new Hashtable<Integer,String>();
    static int count=1;
    public void run() 
    {
            this.htobj.put(10,"ABC");
            this.htobj.put(200,"PQR");
            this.htobj.put(1,"JKL");
            this.dis();
    }
    void dis()
    {
        try
        {
            Enumeration<String> eobj=this.htobj.elements();
            while(eobj.hasMoreElements())
            {
                System.out.print(eobj.nextElement());
                if(count%2!=0)
                {
                    System.out.print("\t\t\t\t");
                    count++;
                }
                else
                {
                    System.out.println();
                    count++;
                }
                Thread.sleep(2000);
            }           
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
    public static void main(String[] args)
    {
        HashTable_With_Enumeration heobj1=new HashTable_With_Enumeration();
        HashTable_With_Enumeration heobj2=new HashTable_With_Enumeration();     
        Thread t=new Thread(heobj1,"HashTable_Thread1");
        Thread t2=new Thread(heobj2,"HashTable_Thread2");
        try
        {
            System.out.print("\n"+t.getName()+" Values \t"+t2.getName()+ "Values     
              \n");                     
            t.start();  
            Thread.sleep(500);          
            t2.start();
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
      }
   }