JVM-----第十三章 线程安全与锁优化

第十三章 线程安全与锁优化


1. 线程安全

​ 线程安全的一个比较恰当的定义:“当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的.”

​ 这个定义要求线程安全的代码都必须具备一个特征:代码本身封装了所有必要的正确性保障手段,领调用者无需关心多线程的问题,更无需自己采取任何措施来保证多线程的正确调用.

​ 但我们一般会把这个定义弱化一些,将"调用这个对象的行为"更换为"单次调用".

(1). Java语言中的线程安全

​ 可以将Java语言中的各种操作共享的数据分为一下5类:不可变,绝对线程安全,相对线程安全,县城建荣和线程独立.

1). 不可变

​ 不可变的对象一定是线程安全的.

​ 如果共享数据是一个基本数据类型,那么只要在定义时使用final关键字修饰它就可以保证它是不可变的.如果是一个对象,则需要保证对象的行为不会对其状态产生任何影响才行(类比java.lang.String类),这种情况下最简单的方法就是把对象中带有状态的变量都声明为final.

2). 绝对线程安全

​ 绝对线程安全要求完全满足之前给出的定义,达到这样的要求通常需要付出很大的代价.Java API中标注自己是线程安全的类,大多数都不是绝对线程安全的.

​ 达到这个程度的线程安全的难点通常出现在连续调用上.

3). 相对线程安全

​ 相对线程安全就是我们通常意义上讲的线程安全,需要保证这个对象单独的操作是线程安全的(非连续调用).

4). 线程兼容

​ 线程兼容是指对象本身并不是线程安全的,但是可以通过在调用端正确地使用同步手段来保证对象在并发环境中可以安全地使用,平常我们所说的一个类是线程不安全的,绝大多数就属于这种情况.

5). 线程对立

​ 线程对立是指无论调用段是否采用了同步措施,都无法在多线程环境中并发使用的代码.由于Java语言天生就具备多线程特性,所以这种情况是很少见的,并且这种情况通常都是有害的,应尽量避免.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值