9-Volatile-CAS-synchronized-lock对比

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38331606/article/details/84620135

volatile

作用

只能保证数据的可见性,但不能保证数据的原子性,同时禁止重排序

原理

通过volatile修饰的变量只存在于JMM的主存空间中,从而保证多线程每次获取的数据均为最新的数据

使用

通常和cas结合使用,如AtomicInteger,unsafe的原子性修改等

CAS

原理

通过原子的方式,完成数据的交换

使用

 

synchronized

作用

在多线程的环境下对资源的同步访问进行控制,保证数据的原子性以及可见性

原理

被synchronized修饰的代码,执行时需要先获取对应的锁对象才能执行代码,获取失败则进入阻塞队列中等待。通过控制代码的执行顺序,以实现数据的原子性以及可见性。

使用

锁的控制和释放是在synchronized同步代码块的开始和结束位置。

在多线程中,和wait(),notify()搭配,用于控制线程之间的等待通知机制。

当获取了多个锁时,它们必须以相反的顺序释放

发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生

Lock

作用

在多线程的环境下对资源的同步访问进行控制,保证数据的原子性以及可见性

原理

相当于Synchronized

使用

其tryLock()许在一定的时间内来获取锁,获取失败则返回false,这样线程可以执行其它的操作 而不至于使线程进入休眠。

Lock接口的实现类ReentrantReadWriteLock提供了读锁和写锁,允许多个线程获得读锁、而只能有一个线程获得写锁。

锁的获取和释放可以在不同的代码块、不同的方法中。

当获取了多个锁时,允许以任何顺序获取和释放多个锁。

Lock()方式添加的锁,在发生异常时不能中断,必须在finally中强制释放锁

发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象

Condition

原理

相当于synchronized(obj)中的对象锁obj.提供await(),signal()

 

 

多线程学习大纲:https://mp.csdn.net/postedit/84768644 

猜你喜欢

转载自blog.csdn.net/qq_38331606/article/details/84620135