当前位置: 代码迷 >> J2SE >> java 多线程 安全有关问题
  详细解决方案

java 多线程 安全有关问题

热度:461   发布时间:2016-04-23 21:45:16.0
java 多线程 安全问题
问题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:
HashMap是非线程安全的,HashTable是线程安全的。关于这句话我理解是当多个线程共享HashMap进行操作的时候,可能会带来非同步,比如会覆盖某些值;但是HashTable不会,那意味着多个线程可以无节制地操作HashTable对象也不会带来问题???

希望能给出一个例子直观看到多线程操作HashMap时带来问题,但换成HashTable不会有问题。


Hashtable,不是 HashTable。

“HashTable是线程安全的” 这句话比较坑,“线程安全”这个定义不好泛泛的去说,多多少少依赖于具体的需求,象 Hashtable 这种工具类直接说它“线程安全”是错误的。正确的说法是,它的方法都加了同步锁。

举一个很简单的例子,迭代,在多线程环境,没有任何其他保护措施的情况下,你直接去迭代遍历一个Hashtable肯定是不安全的。在这方面,ConcurrentHashMap 做得好一些,也仅仅是保证如果发生这种情况一定会抛出 ConcurrentModificationException,Hashtable 连这个exception都不能保证,JavaDOC里写的是未定义行为。

类似的情况单靠 API 级别的努力已经不能保证安全,需要用户代码级别的共同努力。在保证“线程安全”这一点上,常常需要用户代码的努力。

那些告诉你什么“Vector是线程安全的”、“StringBuffer是线程安全的”基本都是坑,看你怎么理解“线程安全”了,很多操作可能不会导致程序崩溃,但也很可能不是你期望的“安全”结果。

如果用户代码只有 put 和 get 操作,基本上可以说 Hashtable 是“线程安全”的。

题外话,Hashtable、Vector这些,早就因为设计缺陷被认为是废弃的工具了,——Map的话用 ConcurrentHashMap, 其他的用 Collections.synchronizedXXX() 方法。

  相关解决方案