?
1.java 内存模型,其实管理java内存模型和os操作内存可以类比。
? ?java里面工作内存其实就是栈,主内存就是堆。
? 操作系统中存在可见性问题,解决方案即缓存一致性,比如两个cpu共同加载了一个内存块,A进行读,B进行写,则B会发送一个写广播,在cpu间进行通信,此时写的优先级会大于读的优先级,所以A收到写广播,会将缓存中的变量置为失效,重新从内存中加载该变量。
? 那么java线程之间同样存在可见性问题,线程A读取变量value,线程B写变量value,线程B写的变量不一定会立刻同步到主存,线程A读取变量不一定会从主存中读取变量。
?
2.java存在哪些并发问题?
? ?一.指令重排序问题,重排序并不意味着所有程序都是杂乱无章的,重排序只是重排序没有相互依赖的代码。比如构造器中创建对象,但是在还没有初始化完成变量之前就已经return了。
? ?二.非volatile的64位变量赋值,其它线程可能读取到的是没有操作完成的半个变量
? ?三.读取到的数据已经失效,已经被其它线程修改了。
?
3.java并发有哪些解决方案?
? 一.第一个问题在某些情况下可以使用定义final变量,使指令重排序失效,JMM内存模型要求final类型的变量的初始化动作必须在return之前完成。
? 二.第二个问题当然就是指定volatile。后面单独讨论下volatile。
? 三.进行加锁的动作
? 四.ThreadLocal定义线程内的变量。
?
原文:http://labreeze.iteye.com/blog/2159505