java多线程共享变量
2016-06-11 20:35
246 查看
每个线程对内存中的变量进行操作时,先读取内存中的共享变量至自己的线程专用的工作内存中,进行操作更新后再同步至主内存共享变量(当然,何时同步过去是不确定的)。各个线程只能操作自己线程内存中的变量,且不能直接操作主内存中共享变量,所以需要进行同步。
1、如果是单纯可见的话,可以使用volatile变量。volatile变量每次被更新后,都会将变量值同步到主内存中。(在同步至主内存的过程中,会让其他线程缓存的变量值失效)。而对于那些缓存失效的线程来说,因为如果缓存失效,其实是等同于每次获取的都是主内存中的最新共享变量。所以直观感受就是volatile变量可以每次直接读取主内存中的变量,而每次修改也是直接修改主内存中的变量,保证了多线程下的可见性。
不过,值得注意的是volatile只保证可见性,不保证原子性。比如对于i++这种操作,i的结果就是不能保证的。因为i++实际包含了读取i,i+1,写回i三个步骤,这三个步骤并不是原子的,如果多个线程同时执行的话,必然会出问题。
2、如果要保证共享变量可见且一致的话,那么采取synchronize是一个不错的方法。(当然,lock也是,同时可能比synchronize更精细?)synchronize可以对访问共享变量的代码加上锁,每个线程执行到这一步时,会先获得锁,清空自己线程内存中缓存变量,读取主内存共享变量并操作,刷新主内存变量,释放锁。从而保证每个线程能获得的主内存变量都是最新的。
1、如果是单纯可见的话,可以使用volatile变量。volatile变量每次被更新后,都会将变量值同步到主内存中。(在同步至主内存的过程中,会让其他线程缓存的变量值失效)。而对于那些缓存失效的线程来说,因为如果缓存失效,其实是等同于每次获取的都是主内存中的最新共享变量。所以直观感受就是volatile变量可以每次直接读取主内存中的变量,而每次修改也是直接修改主内存中的变量,保证了多线程下的可见性。
不过,值得注意的是volatile只保证可见性,不保证原子性。比如对于i++这种操作,i的结果就是不能保证的。因为i++实际包含了读取i,i+1,写回i三个步骤,这三个步骤并不是原子的,如果多个线程同时执行的话,必然会出问题。
2、如果要保证共享变量可见且一致的话,那么采取synchronize是一个不错的方法。(当然,lock也是,同时可能比synchronize更精细?)synchronize可以对访问共享变量的代码加上锁,每个线程执行到这一步时,会先获得锁,清空自己线程内存中缓存变量,读取主内存共享变量并操作,刷新主内存变量,释放锁。从而保证每个线程能获得的主内存变量都是最新的。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树