volatile和synchronized区别
2017-03-21 00:00
169 查看
1、volatile不会进行加锁操作:
volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制。2、volatile变量作用类似于同步变量读写操作:
从内存可见性的角度看,写入volatile变量相当于退出同步代码块,而读取volatile变量相当于进入同步代码块。3、volatile不如synchronized安全:
在代码中如果过度依赖volatile变量来控制状态的可见性,通常会比使用锁的代码更脆弱,也更难以理解。仅当volatile变量能简化代码的实现以及对同步策略的验证时,才应该使用它。一般来说,用同步机制会更安全些。4、volatile无法同时保证内存可见性和原则性:
加锁机制(即同步机制)既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性,原因是声明为volatile的简单变量如果当前值与该变量以前的值相关,那么volatile关键字不起作用,也就是说如下的表达式都不是原子操作:“count++”、“count = count+1”。当且仅当满足以下所有条件时,才应该使用volatile变量:
1、 对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值。
2、该变量没有包含在具有其他变量的不变式中。
总结:在需要同步的时候,第一选择应该是synchronized关键字,这是最安全的方式,尝试其他任何方式都是有风险的。尤其在、jdK1.5之后,对synchronized同步机制做了很多优化,如:自适应的自旋锁、锁粗化、锁消除、轻量级锁等,使得它的性能明显有了很大的提升。
相关文章推荐
- volatile和synchronized的区别与联系
- Java中volatile和synchronized 作用以及区别
- 转:volatile和synchronized的区别
- volatile和synchronized的区别
- 线程同步synchronized和volatile用法及区别
- volatile和synchronized的区别
- java多线程中synchronized(同步块)和volatile的区别
- synchronized 与 volatile 区别 还有 volatile 的含义
- volatile和synchronized的区别
- java 里面保留字volatile及其与synchronized的区别
- java 里面保留字volatile及其与synchronized的区别
- java synchronized与volatile的区别
- volatile和synchronized的区别与联系[转]
- java 里面保留字volatile及其与synchronized的区别
- volatile和synchronized的区别:
- Java volatile和synchronized 区别
- java中 synchronized 和 volatile 区别
- java 里面保留字volatile及其与synchronized的区别
- volatile、synchronized、lock有什么区别,以及在哪些场景下使用哪种方式?
- synchronized和volatile的区别