Hashmap和Hashtable区别

HashMap和Hashtable都实现了Map接口
 
区别有:线程安全性,同步(synchronization),以及速度
 
HashMap是非synchronized的,可以接受为null的键值(key)和值(value)
HashMap不能保证随着时间的推移Map中的元素次序是不变的
 
Hashtable是synchronized,Hashtable是线程安全的,多个线程可以共享一个Hashtable
如果没有正确的同步的话,多个线程是不能共享HashMap
 
因为Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,那么使用HashMap性能比Hashtable好
 
线程安全:就是当多线程访问时,采用了加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。防止出现数据不一致或者数据被污染的情况。
 
线程不安全:就是不提供数据访问时的数据保护,多个线程能够同时操作某个数据,从而出现数据不一致或者数据污染的情况。
 
对于线程不安全的问题,一般会使用synchronized关键字加锁同步控制
 
线程安全 工作原理: jvm中有一个main memory(主储存器)对象,每一个线程也有自己的working memory(工作记忆),一个线程对于一个变量variable进行操作的时候, 都需要在自己的working memory里创建一个copy,操作完之后再写入main memory。
 
当多个线程操作同一个变量variable,就可能出现不可预知的结果。
 
而用synchronized的关键是建立一个监控monitor,这个monitor可以是要修改的变量,也可以是其他自己认为合适的对象(方法),然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完加载load到working memory 到 use && 指派assign 到 存储store 再到 main memory的过程。才会释放它得到的锁。这样就实现了所谓的线程安全。
 
 
 

posted @ 2019-06-14 21:26  lijiyang  阅读(443)  评论(0编辑  收藏  举报