线程安全与锁优化

一、线程安全

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

线程安全的代码都必须具备一个特征:代码本身封装了 所有毕业的正确性保障手段,令调用者无须关系多线程的问题,
更无须自己采用任何措施来保证多线程正确调用。

1、java语言中的线程安全

此处讨论线程安全,限定于多个线程之间存在数据访问的前提。

按照线程安全与强到弱排序,将java语言中各种操作共享数据分为5类:

  • 不可变:不可变的对象一定是线程安全的,无论是对象的方式实现还是方法发调用者,都不需要采取任何线程安全保障措施。
    如果共享数据是一个基本数据类型,那么只有在定义时使用final关键字修饰它,就可以保证他是不可变的。

如果共享数据是一个对象,那就要保证对象的行为不会对其自身状态产生任何影响。简单的方式就是把对象中带有状态的变量都声明为final,
这样在构造函数结束之后,他就是不可变的。

  • 绝对线程安全:满足线程安全的定义“不管运行时环境如何,调用者都不需要任何额外的同步措施”
  • 相对线程安全:就是通常意义上讲的线程安全,他需要保证对这个对象单独操作是线程安全的,在调用的时候不需要额外的保证措施,
    对一些特定顺序的连续调用,就可以需要在调用端使用额外的同步手段来保证调用的正确性。

在java中大部分线程安全都属于此类,如Vector、HashTable、Collections的synchronizedCollection()方法包装的集合等。

  • 线程兼容:指对象本身不是线程安全的,可以通过调用端正确的使用同步手段保证对象在并发环境中可以安全的使用。
    平时常说的一个类不是线程安全的,绝大多数指的是这一种情况
  • 线程对立:无论调用端是否采取了同步措施,都无法在多线程环境中并发使用代码。

2、线程安全的实现方法

2.1、互斥同步

互斥同步是常见的一种并发正确性保障手段。同步是指在多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个线程使用。
互斥是实现同步的一种手段,临界区(Critical Selection)、互斥量(Mutex)、信号量(Semaphore) 都是主要的互斥实现方式。
因此互斥是因,同步是果,互斥是方法同步是目的。

原文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值