如何保证集合是线程安全的?

作者&投稿:尔送 (若有异议请与网页底部的电邮联系)
如何保证集合是线程安全的?~

1、不可变

在java语言中,不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施。如final关键字修饰的数据不可修改,可靠性最高。

2、绝对线程安全

绝对的线程安全完全满足Brian GoetZ给出的线程安全的定义,这个定义其实是很严格的,一个类要达到“不管运行时环境如何,调用者都不需要任何额外的同步措施”通常需要付出很大的代价。

3、相对线程安全

相对线程安全就是我们通常意义上所讲的一个类是“线程安全”的。

它需要保证对这个对象单独的操作是线程安全的,我们在调用的时候不需要做额外的保障措施,但是对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性。

在java语言中,大部分的线程安全类都属于相对线程安全的,例如Vector、HashTable、Collections的synchronizedCollection()方法保证的集合。

4、线程兼容

线程兼容就是我们通常意义上所讲的一个类不是线程安全的。

线程兼容是指对象本身并不是线程安全的,但是可以通过在调用端正确地使用同步手段来保证对象在并发环境下可以安全地使用。Java API中大部分的类都是属于线程兼容的。如与前面的Vector和HashTable相对应的集合类ArrayList和HashMap等。

5、线程对立

线程对立是指无论调用端是否采取了同步错误,都无法在多线程环境中并发使用的代码。由于java语言天生就具有多线程特性,线程对立这种排斥多线程的代码是很少出现的。

一个线程对立的例子是Thread类的supend()和resume()方法。如果有两个线程同时持有一个线程对象,一个尝试去中断线程,另一个尝试去恢复线程,如果并发进行的话,无论调用时是否进行了同步,目标线程都有死锁风险。正因此如此,这两个方法已经被废弃啦。

1、不可变

在java语言中,不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施。如final关键字修饰的数据不可修改,可靠性最高。

2、绝对线程安全

绝对的线程安全完全满足Brian GoetZ给出的线程安全的定义,这个定义其实是很严格的,一个类要达到“不管运行时环境如何,调用者都不需要任何额外的同步措施”通常需要付出很大的代价。

3、相对线程安全

相对线程安全就是我们通常意义上所讲的一个类是“线程安全”的。

它需要保证对这个对象单独的操作是线程安全的,我们在调用的时候不需要做额外的保障措施,但是对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性。

在java语言中,大部分的线程安全类都属于相对线程安全的,例如Vector、HashTable、Collections的synchronizedCollection()方法保证的集合。

4、线程兼容

线程兼容就是我们通常意义上所讲的一个类不是线程安全的。

线程兼容是指对象本身并不是线程安全的,但是可以通过在调用端正确地使用同步手段来保证对象在并发环境下可以安全地使用。Java API中大部分的类都是属于线程兼容的。如与前面的Vector和HashTable相对应的集合类ArrayList和HashMap等。

5、线程对立

线程对立是指无论调用端是否采取了同步错误,都无法在多线程环境中并发使用的代码。由于java语言天生就具有多线程特性,线程对立这种排斥多线程的代码是很少出现的。

一个线程对立的例子是Thread类的supend()和resume()方法。如果有两个线程同时持有一个线程对象,一个尝试去中断线程,另一个尝试去恢复线程,如果并发进行的话,无论调用时是否进行了同步,目标线程都有死锁风险。正因此如此,这两个方法已经被废弃啦。

1.在传统的集合框架中,如何解决线程安全问题。 当然,除了Hashtable等同步容器,我们可以使用同步包装器创建一个线程安全的容器。但是这种方式用的是非常粗的同步方式,在高并发情况下,性能比较低下。 具体的位置...
2.重头戏首选的肯定还是我们的Java并发包啊 具体位置如下: 下面楼主也写了一些示范如何使用的简单代码: package com...
3.关于Java8以后的ConcurrentHashMap的一点思考。 Concurrent...


线程安全的list之synchronizedList和CopyOnWriteArrayList
在整个过程中是使用ReentrantLock可重入锁来保证不会有多个线程同时copy一个新的数组,从而造成的混乱。并且使用volatile修饰数组来保证修改后的可见性。读写操作互不影响,所以在整个过程中整个效率是非常高的。synchronizedList适合对数据要求较高的情况,但是因为读写全都加锁,所有效率较低。

并发遍历实现线程安全遍历
并发集合实现线程安全的遍历通常有两种方式:一是对遍历对象的快照进行遍历。二是对遍历对象进行准实时的遍历。快照是在 Iterator 实例被创建的那一刻待遍历对象内部结构的一个吟诗副本(对象),它反映了待遍历集合的某一时刻(即 Iterator 实例被创建的那一刻)的状态(不包括集合元素的状态)。由于对同...

请简要说明java中线程安全是怎么回事?
有条件的线程安全有条件的线程安全类对于单独的操作可以是线程安全的,但是某些操作序列可能需要外部同步。条件线程安全的最常见的例子是遍历由 Hashtable 或者 Vector 或者返回的迭代器 -- 由这些类返回的 fail-fast 迭代器假定在迭代器进行遍历的时候底层集合不会有变化。为了保证其他线程不会在遍历的时候...

List、Dictionary等集合类不是线程安全的吗?求教!
参考MSDN LIST线程安全 --- 此类型的公共静态(在 Visual Basic 中为 Shared)成员是线程安全的。 但不能保证任何实例成员是线程安全的。只要不修改该集合, List<T>就可以同时支持多个阅读器。 枚举整个集合本质上不是一个线程安全的过程。在枚举与一个或多个写访问竞争的罕见情况下,确保线程安全的...

【集合】List、Map、Set部分实现类是否线程安全
1.1   ArrayList 不是线程安全的。多线程情况下操作ArrayList 不是线性安全的,可能会抛出 java.util.ConcurrentModificationException 并发修改异常。 1.2   Vector 是线程安全的。Vector对add和get方法都加了关键字synchronized修饰,所以是线程安全的,但是同一时间只能有一个线程访问...

ConcurrentHashMap
案例2:业务操作的线程安全不能保证 案例3:多线程删除 12.7 对比Hashtable Hashtable和ConcurrentHashMap的不同点:Hashtable对get,put,remove都使用了同步操作,它的同步级别是正对Hashtable来进行同步的,也就是说如果有线程正在遍历集合,其他的线程就暂时不能使用该集合了,这样无疑就很容易对性能...

线程安全的安全程度
有条件的线程安全类对于单独的操作可以是线程安全的,但是某些操作序列可能需要外部同步。条件线程安全的最常见的例子是遍历由 Hashtable 或者 Vector 或者返回的迭代器 -- 由这些类返回的 fail-fast 迭代器假定在迭代器进行遍历的时候底层集合不会有变化。为了保证其他线程不会在遍历的时候改变集合,进行迭...

多线程中什么情况下会出现线程安全问题
但由于执行时序不同,最终的结果可能会受到影响。3、死锁:当多个线程相互等待对方释放资源时,可能导致死锁。死锁会使得程序无法继续执行,影响系统的正常运行。4、性能问题:由于需要进行同步操作来保证线程安全,可能导致性能下降。例如,过多的锁竞争可能导致线程频繁阻塞,降低程序的并发性能。

第70条: 线程安全性的文档化
由这些类返回的 fail-fast 迭代器假定在迭代器进行遍历的时候底层集合不会有变化。为了保证其他线程不会在遍历的时候改变集合,进行迭代的线程应该确保它是独占性地访问集合以实现遍历的完整性。通常,独占性的访问是由对锁的同步保证的。并且类的文档应该说明是哪个锁(通常是对象的内部监视器(intrinsic ...

安全集合是什么意思?
但都提供了线程安全的访问方式。在多线程或多进程的并发环境中,使用安全集合可以避免多个线程或进程同时访问共享数据时出现的问题。如果程序中使用非安全集合,可能会导致数据损坏或程序崩溃,这样就会严重影响程序的可用性和稳定性。因此,使用安全集合是一种非常必要且常见的编程实践。

花溪区18598002777: Java中的类如何保证线程安全 -
封婷独活: java中,线程安全的解决方法或过程:1.如果对象是immutable,则是线程安全的,例如:String,可以放心使用.2. 如果对象是线程安全的,则放心使用.3.有条件线程安全,对于Vector和Hashtable一般情况下是线程安全的,但是对于某些特殊情况,需要通过额外的synchronized保证线程安全.4.使用synchronized关键字.

花溪区18598002777: 如何解决线程安全问题 -
封婷独活: 有2种解决方法. 第一,是采用原子变量,毕竟线程安全问题最根本上是由于全局变量和静态变量引起的,只要保证了对于变量的写操作要么全写要么不写,就可以解决线程安全,定义变量用sig_atomic_t和volatile. 第二,就是实现线程间同步啦,用互斥索,信号量.让线程有序的访问变量就可以啦

花溪区18598002777: 哪些集合对象线程是安全的,哪些是不安全的 -
封婷独活: 一些历史类的一般是线程安全的,例如:Vector,HashTable等 在jdk升级后,出现了替代一些集合的类,ArrayList,HashMap等,一般都是线程不安全的.

花溪区18598002777: 如何解决java中线程安全问题 -
封婷独活: java中,线程安全的解决方法或过程:1.如果对象是immutable,则是线程安全的,例如:String,可以放心使用.2. 如果对象是线程安全的,则放心使用.3.有条件线程安全,对于Vector和Hashtable一般情况下是线程安全的,但是对于某些特殊情况,需要通过额外的synchronized保证线程安全.4.使用synchronized关键字.

花溪区18598002777: 怎么理解集合中线程安全和不安全的问题 -
封婷独活: 线程安全,就是集合里面的元素可以随便任意多个人同时读写,不会出问题;线程不安全就是不能多个人随便一起操作会乱套的.

花溪区18598002777: 多线程环境下如何正确使用Java集合类 -
封婷独活: 线程安全性是多线程环境下的编程必须面对的棘手的问题.本文从对集合进行迭代常常遇到的java.util.ConcurrentModificationException出发,分析了异常发生的根本原因和底层机理,给出在多线程环境下使用Java集合类的两个正确方法,一个是将迭代器转换为数组,另一个是使用并发集合类.掌握了这两种方法,才能在多线程环境下正确地使用Java集合类.

花溪区18598002777: 通常什么情况下需要考虑线程安全,有什么策略确保线程安全 -
封婷独活: 涉及到数据共享及数据的修改的情况下一般要考虑线程安全,比如有一个原始数据5,我在一个线程中要将这个数据加5,那么我就在这个线程中读取到这个数据然后加5得到10,然后再把10存入这个原始数据中,因为没有考虑线程安全,在我存入之前,有另一个线程修改了这个数据,把原始数据修改为0,然后之前的线程又才将10存入那个原始数据,那么此时这个原始数据就成为了10,然后因为之前有线程修改过,实际应该为5,这里只是数字,如果这个数字是钱呢?你的账户就会凭空多出钱来!还有很多种出错的情况,这里只是其中一种,所以在某些情况下必须要考虑线程安全性

花溪区18598002777: 在Java如何保证方法是线程安全的 -
封婷独活: 用同步代码块synchronized{}每当一个线程进到这里,其他的的线程就进不来.

花溪区18598002777: List、Dictionary等集合类不是线程安全的吗?求教! -
封婷独活: 参考MSDN LIST线程安全 --------------------------------------------------------------------------------此类型的公共静态(在 Visual Basic 中为 Shared)成员是线程安全的. 但不能保证任何实例成员是线程安全的.只要不修改该集合, List<T>就可以同时支持多个阅读器. 枚举整个集合本质上不是一个线程安全的过程.在枚举与一个或多个写访问竞争的罕见情况下,确保线程安全的唯一方法是在整个枚举期间锁定集合.若允许多个线程对集合执行读写操作,您必须实现自己的同步.

花溪区18598002777: 实现原理,如何保证HashMap的线程安全 -
封婷独活: 有2种办法让HashMap线程安全,分别如下:方法一:通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的. 这个要求大家习惯基于接口编程,因为返回的并不是HashMap,而是一个Map的实现.方法二:重新改写了HashMap,具体的可以查看java.util.concurrent.ConcurrentHashMap. 这个方法比方法一有了很大的改进.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网