天天看点

《深入理解java虚拟机》七-线程安全与锁优化

一、线程安全

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

1.java语言中线程安全

(1)不可变

在Java语言中,不可变的对象一定是线程安全的,无论是对象的方法实现还是对象的调用者,都不需要再采取任何的线程安全保障措施。

(2)绝对线程安全

绝对的线程安全需要满足上述的线程安全定义。

(3)相对线程安全

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

(4)线程兼容

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

(5)线程对立

线程对立是指无论调用端是否采取了同步措施,都无法在多线程环境中并发的使用的代码。

2. 线程安全的实现方法

(1)互斥同步

同步是指多个线程并发访问共享数据时,保证共享数据在同一时刻只被一个线程使用。

在java中,最基本的互斥同步手段就是synchronized关键字,除了synchronized外,还可以使用ReentrantLock来实现同步。

(2)非阻塞同步

互斥同步最主要的问题就是进行线程阻塞和唤醒所带来的性能问题,因此这种同步也称阻塞同步。

(3)无同步方案

同步只是保证共享数据争用时的正确性的手段,如果一个方法本身就不涉及共享数据,那它自然就无须任何同步措施去保证正确性。

a. 可重入代码

b.线程本地存储

继续阅读