volatile的应用
在多线程并发程序中synchronized和volatile都扮演者着很重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的可见性,能够防止脏读,被volatile关键字修饰的变量,如果值发生了改变,其他线程立刻可见;
可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值,如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低;
volatile定义
java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量;java语言提供了volatile,在某些情况下比锁更加方便,如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的;
volatile和synchronized有什么区别
volatile能够保证数据可见性,但是无法保证数据的原子性;
synchronized能够保证数据可见性,也能保证数据原子性;
volatile使用条件
只能在有限的一些情形下使用volatile变量替代锁;要使volatile变量提供理想的线程安全,必须满足下面两个条件:
1.对变量的写操作不依赖于当前值;
2.该变量没有包含在具体变量的不变式中;
实际上,这些条件声明,可以被写入volatile变量的这些有效值独立于任何程序的状态,包含变量的当前状态;
第一个条件的限制使volatile变量不能用作线程安全计数器;虽然增量操作(i++)看上去类似于一个单独的操作,实际上它是一个由(读取-修改-写入)操作序列组成的组合操作;必须以原子方式执行,而volatile不能提供必须的原子特性;实现正确的操作需要使i的值在操作期间保持不变,而volatile变量无法实现这点;
volatile优点
1.内存中只有一个对象,减少内存开销;
2.单例可避免对资源的多重占用,例如写文件工作,可避免对同一资源文件的同时写操作;
volatile缺点
1.单例模式一般没有接口,扩展很困难;
2.不利于测试,并行开发时,若单例未完成,则不能进行测试;
3.与单一职责原则冲突;