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()
|