线程安全?

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


线程安全?

1、如何定义线程安全?

前置条件:
不考虑这些线程在运行时环境下的调度和交替执行,也不考虑提供一些行为来保护该【对象】:

  1. 进行额外的同步
  2. 在调用方执行任何其他的协调操作

事件:
当多个线程访问同一个【对象】时,调用这个对象的行为都可以获取正确的结果,就称呼这个【对象】【线程安全】的。


2、什么样的对象是含有线程安全的概念的?

2.1、不可变的对象

  1. final + 基本数据类型
  2. String 、枚举类型,java.long.Number的部分子类(如Long和Double等数值包装类),BigInteger和BigDecimal等大数据类型

2.2、绝对线程安全的对象

首先我们说一下绝对安全,对于保证一个对象【绝对线程安全】,即对于该对象,不管运行时环境如何,调用方都不需要任何额外的同步行为,达到调用这个对象的行为都可以返回正确的结果,对于这个过程来说,可能会付出非常昂贵的代价,甚至不切实际的代价,因此我们一般的处理方法,都是用【相对线程安全】的对象 +【同步措施】来保证这个对象是【线程安全】的。
对于在java API 中标注自己是线程安全的类,大多数都不是绝对安全的。

2.3、相对线程安全的对象

【相对线程安全】就是我们通常意义上的【线程安全】,即对象单次操作是线程安全的。
例如: Vector、HashTable、Collections的synchronizeCollection()方法包装的集合类

2.4、线程兼容

【线程兼容】的意思是对象本身不是线程安全的,但是可以通过使用【正确的同步措施手段】来保证对象在并发环境下使用。
例如:ArrayList和HashMap等

2.5、线程对立

简单来说就是排除多线程环境的代码,这种都是有害的,应尽量避免,因为会有死锁的风险。


3、安全程度对比

【不可变的对象】>【绝对线程安全的对象】>【相对线程安全的对象】>【线程兼容】>【线程对立】

おすすめ

転載: blog.csdn.net/weixin_38316697/article/details/115007757