synchronized、volatile和lock
特性 | synchronized | volatile |
---|---|---|
原子性 | true | false |
可见性 | true | true |
是否阻塞线程 | true | false |
使用级别 | 变量、方法、类 | 变量 |
用途 | 锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住 | 告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取 |
使用范围 | a、对变量的写操作不依赖于当前值。b、该变量没有包含在具有其他变量的不变式中。 |
synchronized和lock区别
锁机制:synchronized、Lock、Condition
特性 | synchronized | ReentrantLock |
---|---|---|
是否需要手动释放 | false | true |
等待中的线程是否可以中断等待 | false | true |
是否可以主动获得锁 | false | true(投票等方式) |
是否支持定时 | false | true |
其他 | synchronized是在JVM层面上实现的(语言级别)JVM会自动释放锁定 | lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中 |