锁、volatile、CAS的比较

  • Post author:
  • Post category:其他



一、锁


锁是一种

悲观

的机制。为多线程提供了互斥的访问机制。多个线程同时竞争锁时,没获得锁的线程将会被挂起(智能的JVM会根据之前获取锁操作中对锁的持有时间长短来判断是使线程挂起还是自旋)

锁的劣势:

1.未竞争到锁的线程挂起后再恢复时,会进行上下文的切换,开销大。

2.当一个线程正在等待锁时,它不能干任何其它事情。

如果持有锁的线程被延迟执行(例如发生了缺页错误、调度延迟、或者其它类似情况),那么所有需要该锁的线程都必须等待下去。

如果被阻塞线程的优先级较高,而持有锁的线程优先级较低,那么这将是一个严重的问题——

优先级反转

。即使高优先级的线程可以抢先执行,但仍然需要等待锁被释放,从而导致它的优先级会降至低优先级线程的级别。

如果持有锁的线程被永久阻塞(例如由于出现无限循环,死锁,活锁或者其他的活跃性障碍),所有等待这个锁的线程就永远无法执行下去。


二、volatile

与锁相比,volatile是一种更轻量级的同步机制。

volatile的优势:在使用这些变量时,不会发生上下文切换和线程调度等操作。

volatile的局限:

不能保证复合操作的原子性

。例如i++,并不能通过volatile来保证原子性。


三、CAS

对于细粒度操作,除了volatile提供的轻量级的同步机制,还有另外一种更高效的

乐观

方法。

在针对多处理器操作而设计的处理器中提供了一些特殊指令,用于管理对共享数据的并发访问。

现在,几乎所有的现代处理器中都包含了某种形式的原子读-改-写指令,例如比较并交换(compare and swap)、关联加载/条件存储(load linked/store conditional)。操作系统和JVM使用这些指令来实现锁和并发的数据结构。


四、锁与原子变量的比较  以及 非阻塞算法

请参考《Java并发编程实战》第15章

总结

1.锁的优缺点?

2.volatile的优缺点?

3.什么是CAS?其原理、优势?

4.JVM如何支持CAS的?

5.什么是ABA问题?如果解决?

参考资料:《Java并发编程实战》

转载于:https://www.cnblogs.com/rouqinglangzi/p/9106249.html