并发编程中的三个概念
- 原子性:原子是世界上的最小单位,具有不可分割性。原子性意味着一个线程一次只能执行由一个指定监控对象(lock)保护的代码,从而防止多个线程在更新共享状态时相互冲突。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。
- 可见性:是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的,即当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
- 指令重排序:不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。指令重排序不会影响单个线程的执行,但是会影响到线程并发执行的正确性。
volatile关键字
volatile是一种比synchronized关键字较轻量级的同步机制,在访问volatile变量时不会执行加锁操作,也不会造成线程的阻塞,被volatile修饰的成员变量,在各个线程的私有工作内存中不存在它的私有拷贝,各个线程在访问该变量前必须从主存(共享内存)中读取该变量的值。
volatile修饰的变量不允许线程内部缓存和重排序即直接修改内存。volatile关键字保证了被它修饰的变量值修改后立即同步到主内存,每次使用该变量前都从主内存中刷新,即被volatile修饰的变量对所有的线程是可见的,对volatile变量的所有的写操作都能立即反映到其他线程中。
volatile关键字只能保证共享变量的可见性,只能保证不同线程每次访问该共享变量时读取的是该变量的最新值,但不能保证对变量的操作的原子性。
volatile关键字无法保证操作的原子性,通常来说,使用volatile关键字必须具备以下2个条件:
①对变量的写操作不依赖当前值,或者能够确保只有单一的线程修改变量的值。
②该变量没有包含在具有其他变量的不变式中,或者说变量不需要与其它的状态变量共同参与不变约束。
以上条件说明,n++,n--这些非原子操作不能保证volatile关键字修饰的变量在并发条件下值的正确性,而只有n=m+1,n=5,这些原子操作才能保证该变量在并发环境下值的正确性。
引用:https://www.jianshu.com/p/387a04a78c84