问题1:
HashMap是非线程安全的,HashTable是线程安全的。关于这句话我理解是当多个线程共享HashMap进行操作的时候,可能会带来非同步,比如会覆盖某些值;但是HashTable不会,那意味着多个线程可以无节制地操作HashTable对象也不会带来问题???希望能给出一个例子直观看到多线程操作HashMap时带来问题,但换成HashTable不会有问题。
问题2:
"只能由持有对像锁的线程来调用"说明wait方法与notify方法必须在同步块内执行,即synchronized(obj)之内; 这里在synchronized(obj)区域内,其他对象可以调用wait及notify么,比如obj2.wait()吗?
比如下面的代码允许吗?synchronized (queue) {
while(cur == len){
try {
o1.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

queue[cur++] = baozi;

o2.notifyAll();
}问题3:
obj.notify()能够唤醒当前一个由于obj.wait()等待的线程,但是如果当前没有obj对象的wait线程,那这个notify就相当于作废了?
问题4:希望大家给一些java多线程的学习资料,电子版或者博客推荐。。谢谢
java 多线程 wait notify

解决方案 »

  1.   

    问题1:
    —— 出现并发问题,一般来说是要发生结构变动或冲突的时候,比如:Map之前所准备的容量已满,要进行扩容的期间(这个过程叫resize(),会发生大规模搬移transfer());还有Key所算出来的位置值,刚好发生冲突,于是挂接链表时。
    —— 总的来说,想一两次就简单重现,也许不那么容易,不过如果熟悉HashMap机制,然后准确的对照其弱点进行测试,应该还是能测试出来的。
    问题2:
    —— 显然不可以。这类问题,自己测试下不就行了?
    问题3:
    —— 可以这么理解了。
    问题4:
    —— 有空多去看看Ticmy的Blog。
    —— 并发群:229609257
      

  2.   


    Hashtable,不是 HashTable。“HashTable是线程安全的” 这句话比较坑,“线程安全”这个定义不好泛泛的去说,多多少少依赖于具体的需求,象 Hashtable 这种工具类直接说它“线程安全”是错误的。正确的说法是,它的方法都加了同步锁。举一个很简单的例子,迭代,在多线程环境,没有任何其他保护措施的情况下,你直接去迭代遍历一个Hashtable肯定是不安全的。在这方面,ConcurrentHashMap 做得好一些,也仅仅是保证如果发生这种情况一定会抛出 ConcurrentModificationException,Hashtable 连这个exception都不能保证,JavaDOC里写的是未定义行为。类似的情况单靠 API 级别的努力已经不能保证安全,需要用户代码级别的共同努力。在保证“线程安全”这一点上,常常需要用户代码的努力。那些告诉你什么“Vector是线程安全的”、“StringBuffer是线程安全的”基本都是坑,看你怎么理解“线程安全”了,很多操作可能不会导致程序崩溃,但也很可能不是你期望的“安全”结果。如果用户代码只有 put 和 get 操作,基本上可以说 Hashtable 是“线程安全”的。题外话,Hashtable、Vector这些,早就因为设计缺陷被认为是废弃的工具了,——Map的话用 ConcurrentHashMap, 其他的用 Collections.synchronizedXXX() 方法。
      

  3.   

    Map<String, Object> map = Collections.synchronizedMap(new HashMap<String, Object>());试试这个,相当于线程安全的
      

  4.   

    hashtable 在读改写模式下,绝对绝对不是线程安全的,其他就不多说了