感觉应该同步,要不读的进程刚找到key,这是时间片结束,另一个进程正好删除这个key,下一次读进程就会出错

解决方案 »

  1.   

    但是Hashtable保存的应该是对象的指针,Hashtable得remove方法应该只是删除Hashtable保存的指针对吗?
    如果这样的话,对于第一种情况,也就是只取得一个对象,也就是取得了该对象的指针,即便另一个线程从Hashtable中删除了该对象的纪录,但该对象因为有变量仍然纪录了该对象的指针,我想该对象应该不会被删除,所以两个进程互不影响,所以不用考虑Hashtable的同步对于第二种情况,如果不用同步,请问如果一个线程正在历遍Hashtable时,这时候另一个线程调用Hashtable的remove函数,会对第一个线程造成什么样的影响?
      

  2.   

    从你的描述来看,是不需要同步的,因为Hashtable已经是线程安全的了。
      

  3.   

    对于第一种情况,我只是猜测,但是我不知道如何做测试,但是Hashtable不是线程安全的,我记得只有Vector是线程安全的。对于第一种情况,我只是在这种特殊的情况下,不需要同步,应为两个线程都不修改保存的数据,一个是使用,一个是删除,所以我觉得不会发生意外,不需要同步,但是我不知道这样行不行。对于第二种情况,肯定是要同步的,英文是这样描述的this would screw us up as we tried to walk through the list,其中this指的是删除Hashtable中的一个键值对操作。我不太明白screw us up是一种什么样的情况?
      

  4.   

    我同意楼上的意见,你可以查一下hashtable是不是线程安全的。
      

  5.   

    楼上的兄弟
    但是这里一个线程是删除Hashtable中的纪录,而可能同时另一个线程还在使用这条记录,这样做也不会出危险?
      

  6.   

    你看看hashtable就知道了,它的方法本来就是同步的,当然在多线程中也一定是原操作了。
      

  7.   

    hashtable方法同步吗?从哪个版本开始的?确定吗?省去一个正确的同步可是要出大问题的阿
      

  8.   

    呵呵, 我不知道从哪撇过一眼, 说 Hashtable 的确是在内部做了同步。不过, 我们现在应该撇开是否 java 的 Hashtable 类是在内部做了同步,就假设他不是内部同步的,我仍然坚持原来的观点,不需要在外边做同步。如果你只有一个线程在删除或修改,没有同步的必要。to netstarry:
    不知道你说的“危险”是什么?我是理解成,一个线程删除对象后,对象不存在,另一个线程再访问就会访问错误。如果是这个,我认为不会有危险,除非是 C++. 在 JAVA 里,只要有线程在使用对象,或说引用着某个对象, 那个对象就不会被删除。
      

  9.   

    谁能确定一下吗?Hashtable类是在内部做了同步,要不然我在外部又做了一次同步岂不是很浪费
      

  10.   

    我看了Hashtable 类的源代码,确实在里面用到了同步,