以下哪个java集合类是线程安全的,java集合线程不安全
如何解决写爬虫IP受阻的问题?立即使用。
线程安全
首先要理解线程是如何工作的,jvm有一个主存,每个线程都有自己的工作。
内存中,当一个线程对一个变量进行操作时,它必须在自己的工作。
在内存中创建一个副本,然后在操作后将其写入main。
记忆.当多个线程同时操作同一个变量时,可能会出现不可预知的结果。根据上面的解释,很容易想出相应的场景。
使用synchronized的关键是建立一个监视器,可以是要修改的变量,也可以是其他你认为合适的对象,比如方法,然后锁定监视器实现线程安全。每个线程得到这个锁之后,在完成加载到工作内存的过程之后,就会释放它得到的锁——使用assign——store到mainmemory。这样就实现了所谓的线程安全。
什么是线程安全?线程安全是怎么做的(原理)?线程安全是指多个线程访问同一个代码,不会产生不确定的结果。编写低依赖线程同步的线程安全代码。
java相关集合
Vector、ArrayList、LinkedList
Vector和ArrayList的用法非常相似。它们都可以用来表示一组数量可变的对象应用程序,并且其中的元素可以被随机访问。
Vector的方法都是同步的,线程安全的,而ArrayList的方法不是。因为线程同步必然会影响性能,所以ArrayList的性能比Vector好。
ArrayList和LinkedList的区别
为了处理数据项列表,Java提供了两个类ArrayList和LinkedList。ArrayList的内部实现是基于内部的array对象[],所以从概念上来说,它更像一个数组。但是链表的内部实现是基于一组连接的记录,所以更像是一个链表结构。所以,他们的表现大相径庭。
从上面的分析可以看出,在ArrayList的前面或中间插入数据时,必须相应地将它后面的数据全部移回来,这必然会花费更多的时间。所以,当你的操作是在一列数据后面而不是前面或中间添加数据,并且需要随机访问其中的元素时,使用ArrayList会提供更好的性能。
当访问LinkedList中的一个元素时,必须从链表的一端开始,沿着连接方向逐个查找,直到找到所需的元素。因此,当您的操作是在一列数据的前面或中间添加或删除数据,并按顺序访问元素时,您应该使用链表。
在编程中,如果1和2两种情况交替出现,那么可以考虑使用List之类的通用接口,不要在意具体的实现。在特定情况下,其性能由特定的实现来保证。
HashTable,HashMap,HashSet
HashTable和HashMap采用相同的存储机制,实现基本相同,区别在于:
1)、HashMap是非线程安全的,HashTable是线程安全的,内部方法基本同步。
2),HashTable不允许空值的存在。
在HashTable中调用put方法时,如果键为null,则直接抛出NullPointerException。还有其他细微的区别,比如初始化条目数组的大小,但是基本思想和HashMap是一样的。
哈希集:
1.HashSet是基于HashMap实现的,没有容量限制。
2.HashSet是非线程安全的。
3.HashSet不保证顺序。
散列表:
1.HashMap使用数组存储由键和值组成的Entry对象,没有容量限制。
2.HashMap根据键哈希找到存储在数组中的条目对象的位置,并使用链表解决哈希冲突。
3.HashMap在插入元素时可能需要扩展数组的容量。当扩展容量时,需要重新计算散列并将对象复制到新的数组中。
4.HashMap是非线程安全的。
5.HashMap遍历使用迭代器。
散列表
1.哈希表是线程安全的。
2.HashTable中的键和值都不能为空。
3.哈希表遍历使用枚举。
树集,树图
树集:
1.TreeSet是基于TreeMap实现的,支持排序。
2.TreeSet是非线程安全的。
从HashSet和TreeSet的描述来看,TreeSet和HashSet一样,完全是基于Map实现的,都不支持get(int)获取指定位置的元素(需要遍历)。此外,TreeSet还提供了一些排序支持。例如,传入比较器实现、descendingSet和descendingIterator。
树形图:
1.TreeMap是典型的基于红黑树的Map实现,所以要求必须有一个键比较方法,要么传入比较器实现,要么Key对象实现Comparable接口。
2.TreeMap是非线程安全的。
总结
这就是本文中关于各种java集合的线程安全的全部内容。希望对你有帮助。
本文来自java入门专栏,欢迎学习!那是深入了解各种java集合的线程安全的细节。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。