synchronized关键字和volatile关键字
2017-12-31 17:47
190 查看
synchronized 可以实现操作得到原子性,其本质是通过该关键字所包括的临界区(Critical Section)的排他性保证在任何一个时刻只有一个形成能够执行临界区中的代码。
原子操作如:对int型变量count执行count++操作就不是原子操作。count++可以分解为3个操作:1读取变量count的当前值,2count的当前值和1做加法运算,3将count值加1后的值赋给count变量,在多线程环境下,上面的例子如果没有对相应的代码同步(Synchronization)处理,则可能出现在执行第2个操作的时候count的值已经被其他线程修改了。
synchronized 可以保证内存的可见性,
cpu在执行代码的时候为了减少变量访问的时间消耗可能将代码中访问的变量的值缓存到该cpu缓存区(如L Cache,L2 Cache)中。因此相应代码再次访问某个变量时,相应的值可能是从CPU缓存区而不是主内存中读取的。同样的,代码对这些被缓存过的变量的值的修改也可能是被写入cpu缓存区,而没有被写回主内存。由于每个cpu都有自己的缓存区,因此一个cpu缓存区中的内容对于其他cpu而言是不可见的。这就导致了在其他cpu运行的其他线程可能无法看到该线程对某个变量值所做的更改。这就是内存可见性。
synchronized 保证了一个线程执行临界区中的代码时所修改的变量值对于稍后执行该临界区中的代码的线程来说是可见的。
volatile关键字 可保证内存可见性即一个线程对一个采用volatile关键字修饰的变量的值的更改对于其他访问该变量的线程而言总是可见的。也就是说,其他线程不会读到一个“过期”的线程。volatile实现内存可见性的核心机制是当一个线程修改了一个volatile 修饰的变量的值时,该值会被写入主内存(RAM)而不仅仅是当前线程所在的cpu的缓存,而其他cpud的缓存区存储的该变量的值也会因此而失效 从而更新为主内存中的该变量的值。
还禁止了指令重排序。
原子操作如:对int型变量count执行count++操作就不是原子操作。count++可以分解为3个操作:1读取变量count的当前值,2count的当前值和1做加法运算,3将count值加1后的值赋给count变量,在多线程环境下,上面的例子如果没有对相应的代码同步(Synchronization)处理,则可能出现在执行第2个操作的时候count的值已经被其他线程修改了。
synchronized 可以保证内存的可见性,
cpu在执行代码的时候为了减少变量访问的时间消耗可能将代码中访问的变量的值缓存到该cpu缓存区(如L Cache,L2 Cache)中。因此相应代码再次访问某个变量时,相应的值可能是从CPU缓存区而不是主内存中读取的。同样的,代码对这些被缓存过的变量的值的修改也可能是被写入cpu缓存区,而没有被写回主内存。由于每个cpu都有自己的缓存区,因此一个cpu缓存区中的内容对于其他cpu而言是不可见的。这就导致了在其他cpu运行的其他线程可能无法看到该线程对某个变量值所做的更改。这就是内存可见性。
synchronized 保证了一个线程执行临界区中的代码时所修改的变量值对于稍后执行该临界区中的代码的线程来说是可见的。
volatile关键字 可保证内存可见性即一个线程对一个采用volatile关键字修饰的变量的值的更改对于其他访问该变量的线程而言总是可见的。也就是说,其他线程不会读到一个“过期”的线程。volatile实现内存可见性的核心机制是当一个线程修改了一个volatile 修饰的变量的值时,该值会被写入主内存(RAM)而不仅仅是当前线程所在的cpu的缓存,而其他cpud的缓存区存储的该变量的值也会因此而失效 从而更新为主内存中的该变量的值。
还禁止了指令重排序。
相关文章推荐
- 【说一千道一万】volatile关键字的作用和synchronized的关系
- 从Java内存模型理解synchronized、volatile和final关键字
- java中关键字volatile的作用; volatile vs synchronized的区别
- Java的3个问题:synchronized方法、volatile关键字、及内部类
- Java 多线程:关键字 synchronized 和 volatile
- 我是菜鸟:java多线程join方法,volatile以及synchronized关键字理解
- 多线程:线程状态、synchronized关键字、读写锁、条件对象、Volatile、阻塞队列等小结
- 谈谈java线程锁synchronized关键字和volatile关键字
- volatile、ThreadLocal、synchronized等3个关键字区别
- Java线程锁,以及volatile、synchronized、Lock关键字
- volatile与synchronized关键字
- Java 多线程编程之synchronized 和 volatile关键字
- volatile/synchronized关键字解释
- Java多线程6:synchronized锁定类方法、volatile关键字及其他
- 多线程经常使用的3个关键字:synchronized、ReentrantLock、volatile
- 关于native,transient,volatile,synchronized四个关键字的使用
- java线程5 volatile和synchronized关键字 .
- Java多线程6:synchronized锁定类方法、volatile关键字及其他
- (转)并发编程之ThreadLocal、Volatile、synchronized、Atomic关键字扫盲
- JAVA中关键字synchronized 和volatile的区别及用法