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()
|
9-Volatile-CAS-synchronized-lock对比
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38331606/article/details/84620135
猜你喜欢
转载自blog.csdn.net/qq_38331606/article/details/84620135
今日推荐
周排行