您的位置:首页 > 编程语言 > Java开发

java多线程共享变量

2016-06-11 20:35 246 查看
每个线程对内存中的变量进行操作时,先读取内存中的共享变量至自己的线程专用的工作内存中,进行操作更新后再同步至主内存共享变量(当然,何时同步过去是不确定的)。各个线程只能操作自己线程内存中的变量,且不能直接操作主内存中共享变量,所以需要进行同步。

1、如果是单纯可见的话,可以使用volatile变量。volatile变量每次被更新后,都会将变量值同步到主内存中。(在同步至主内存的过程中,会让其他线程缓存的变量值失效)。而对于那些缓存失效的线程来说,因为如果缓存失效,其实是等同于每次获取的都是主内存中的最新共享变量。所以直观感受就是volatile变量可以每次直接读取主内存中的变量,而每次修改也是直接修改主内存中的变量,保证了多线程下的可见性。

不过,值得注意的是volatile只保证可见性,不保证原子性。比如对于i++这种操作,i的结果就是不能保证的。因为i++实际包含了读取i,i+1,写回i三个步骤,这三个步骤并不是原子的,如果多个线程同时执行的话,必然会出问题。

2、如果要保证共享变量可见且一致的话,那么采取synchronize是一个不错的方法。(当然,lock也是,同时可能比synchronize更精细?)synchronize可以对访问共享变量的代码加上锁,每个线程执行到这一步时,会先获得锁,清空自己线程内存中缓存变量,读取主内存共享变量并操作,刷新主内存变量,释放锁。从而保证每个线程能获得的主内存变量都是最新的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 共享变量