1、volatile
volatile字段的写入操作happens-before于每一个后续的同一个字段的读操作。
因为实际上put、remove等操作也会更新count的值,所以当竞争发生的时候,volatile的语义可以保证写操作在读操作之前,也就保证了写操作对后续的读操作都是可见的,这样后面get的后续操作就可以拿到完整的元素内容。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
volatile实际上只有在多cpu或者多核下才有用。当读取数据时,他不会cache缓存中读取,而是强制从内从中读取,这样读到的就是最新值。当写入数据的时候,会直接将数据写入内存中,并刷新所有其他核中的缓存,这样其他核看到的就是最新写入的值,也就是说,其他线程就看到了最新写入的值。
一般说来,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
声明方式为 volatile declaration
备注
系统总是在 volatile
对象被请求的那一刻读取其当前值,即使上一条指令从同一对象请求值。而且,该对象的值在赋值时立即写入。
volatile 修饰符通常用于由多个线程访问而不使用 lock 语句来序列化访问的字段。使用 volatile
修饰符能够确保一个线程检索由另一线程写入的最新值。