您的位置:首页 > 其它

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的缓存区存储的该变量的值也会因此而失效 从而更新为主内存中的该变量的值。

                         还禁止了指令重排序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  volatile synchronized