<commit_before>---
layout:     post
title:      "volatile的实现原理"
subtitle:   ""
date:       
author:     "<NAME>"
header-img: "img/post-bg-03.jpg"
---

### Volatile的官方定义
Java编程语言允许线程访问共享变量，为了确保共享变量能被准确和一致的更新，线程应该确保通过排他锁单独获得这个变量。Java语言提供
了volatile，在某些情况下比锁更加方便。如果一个字段被声明成volatile，java线程内存模型确保所有线程看到这个变量的值是一致的。  

### Volatile的实现原理
处理器为了提高处理速度，不直接和内存进行通讯，而是将系统内存的数据独到内部缓存后再进行操作，但操作完后不知什么时候会写到内存。
如果对声明了volatile变量进行写操作时，JVM会向处理器发送一条Lock前缀的指令，将这个变量所在缓存行的数据写会到系统内存。
但这时候其他处理器的缓存还是旧的，所以在多处理器环境下，为了保证各个处理器缓存一致，每个处理会通过嗅探在总线上传播的数据来检查
自己的缓存是否过期，当处理器发现自己缓存行对应的内存地址被修改了，就会将当前处理器的缓存行设置成无效状态，当处理器要对这个数据
进行修改操作时，会强制重新从系统内存把数据读到处理器缓存里。

### Volatile的使用优化
JDK7并发包里面的队列集合类LinkedTransferQueue，在使用volatile变量时，使用一种追加字节的方式来优化队列出队和入队的性能。  <commit_msg>Update 2016-04-28-Volatile的实现原理.markdown<commit_after>---
layout:     post
title:      ""
subtitle:   ""
date:       
author:     ""
header-img: ""
---

### Volatile的官方定义
Java编程语言允许线程访问共享变量，为了确保共享变量能被准确和一致的更新，线程应该确保通过排他锁单独获得这个变量。Java语言提供
了volatile，在某些情况下比锁更加方便。如果一个字段被声明成volatile，java线程内存模型确保所有线程看到这个变量的值是一致的。  

### Volatile的实现原理
处理器为了提高处理速度，不直接和内存进行通讯，而是将系统内存的数据独到内部缓存后再进行操作，但操作完后不知什么时候会写到内存。
如果对声明了volatile变量进行写操作时，JVM会向处理器发送一条Lock前缀的指令，将这个变量所在缓存行的数据写会到系统内存。
但这时候其他处理器的缓存还是旧的，所以在多处理器环境下，为了保证各个处理器缓存一致，每个处理会通过嗅探在总线上传播的数据来检查
自己的缓存是否过期，当处理器发现自己缓存行对应的内存地址被修改了，就会将当前处理器的缓存行设置成无效状态，当处理器要对这个数据
进行修改操作时，会强制重新从系统内存把数据读到处理器缓存里。

### Volatile的使用优化
JDK7并发包里面的队列集合类LinkedTransferQueue，在使用volatile变量时，使用一种追加字节的方式来优化队列出队和入队的性能。  
{'fraction_non_alphanumeric': 0.08725761772853186, 'fraction_numerical': 0.008310249307479225, 'mean_word_length': 9.783582089552239, 'pattern_counts': {'":': 0, '<': 4, '<?xml version=': 0, '>': 4, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6607672', 'n_tokens_mistral': 1088, 'n_tokens_neox': 1279, 'n_words': 42}