Java基础之volatile,static,synchronized的区别
2016-01-22 11:51
447 查看
一说起共享,线程安全之类种种我们很容易就想到了这三个关键字,但是当牵扯到高并发的时候,我们又很容易被这三个概念搞糊涂,跑出来的程序驴头不对马嘴。
首先先说volatile和synchronized之间的区别,在大家的印象里,好像他们都可以支持高并发,这不错,但是可以使用volatile和synchronized运行这样一段程序
你会发现,使用volatile无论你怎么运行,都无法得到正确的结果,而且每次运行的结果都还是不一样的,但是,在代码前加上synchronized你可以发现程序可以运行出正确的结果,这是为什么呢?好好回忆一下volatile的概念,核心在于变量的主存储区和副本区保持一致性,也就是说volatile保证的是变量执行的一致性,并不保证线程执行的有序性和原子性;但是synchronized就会严格控制这些;当然你有兴趣可以继续深入探究一下reentranlock显示锁的区别。
static 大家平时接触的较多,但是这里需要强调的是static保证的是变量的唯一性,
这段代码是线程安全的吗?,当然不是,但是要怎么把他变得线程安全?加个final
首先先说volatile和synchronized之间的区别,在大家的印象里,好像他们都可以支持高并发,这不错,但是可以使用volatile和synchronized运行这样一段程序
public volatile int a=3; int count=3; for(int i=0;i<100;i++) { new Thread( public void run() { a=a+count; } ).start(); }
你会发现,使用volatile无论你怎么运行,都无法得到正确的结果,而且每次运行的结果都还是不一样的,但是,在代码前加上synchronized你可以发现程序可以运行出正确的结果,这是为什么呢?好好回忆一下volatile的概念,核心在于变量的主存储区和副本区保持一致性,也就是说volatile保证的是变量执行的一致性,并不保证线程执行的有序性和原子性;但是synchronized就会严格控制这些;当然你有兴趣可以继续深入探究一下reentranlock显示锁的区别。
static 大家平时接触的较多,但是这里需要强调的是static保证的是变量的唯一性,
public class Sample { private static int count = 0; public static void increment() { count++; } }
这段代码是线程安全的吗?,当然不是,但是要怎么把他变得线程安全?加个final
相关文章推荐
- Java 进阶——自动装箱和自动拆箱
- Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
- Java并发编程:生产者-消费者模式
- java模运算
- 基于Struts2中的Action层、Service层、Dao层理解在SpringMVC对应的四大注解
- java之hook
- Java(.NET)经典排序算法之选择排序
- Java IO流(概述)
- 道与JAVA(二)
- java虚拟机(一):jvm内存区域与内存溢出
- Java对象锁
- Java的序列化机制
- @SuppressWarnings(“...”)/spring…
- JAVA中Action层, Service层&n…
- Spring 中侵入式与非侵入式的区别
- Java 接口
- Java 中的反射机制
- SpringMVC细节细节讲解
- springMVC两种方式实现多文件上传及效率比较
- Java移位