课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习java编程开发,而今天我们就通过案例分析来了解一下,java编程开发类的安全性问题如何解决。
HashMap的结构是怎么样的
HashMap的数据结构是散列结构,散列结构就是我们说的key-value结构,它由一个数组和多个链表组成。每个数组节点对应一个链表。key值是一个数组存放,value的值放在多个链表中存放。
HashMap线程不安全在程序中的体现是什么
多线程操作HashMap的场景下,会发生HashMap的值被覆盖,从而导致数据丢失。既同一个数组对应的链表被反复替换。另外,如果面试官问,会不会出现死循环或者数组下标越界。
既然HashMap线程不安全,为什么我们还经常用它
Map是一个接口,我们常用的实现类有HashMap、HashTable、LinkedHashMap、TreeMap。
HashTable类是线程安全的,它使用synchronize来做线程安全,全局只有一把锁,在线程竞争比较激烈的情况下hashtable的效率是比较低下的。因为当一个线程访问hashtable的同步方法时,其他线程再次尝试访问的时候,会进入阻塞或者轮询状态,进而导致线程挂起。当你在多线程场景下使用Map,虽然不能使用HashMap但也尽量别使用HashTable。其实我个人觉得这个类可以废掉了。
LinkedHashMap就更不用说了,本身也是线程不安全的,而且每次插入的时候都要自己排序一次,每次排序都要进行一次遍历查询。
怎么样可以让HashMap线程安全
在多线程场景下放弃使用HashMap,可以使用CurrentHashMap替代HashMap。CurrentHashMap是綫程安全的,因为它和HashTable一样加了锁。而且我们上边也提到了,由于HashTable使用一把锁(锁住整个链表结构)处理并发问题,多个线程竞争一把锁,容易线程阻塞、挂起。而CurrentHashMap采用CAS+synchronized+Node+红黑树的多段分級锁的机制,可以对链表进行非常细粒度的加锁,不容易造成线程阻塞。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。