java并发浅析第一篇

 

1.java 内存模型,其实管理java内存模型和os操作内存可以类比。

   java里面工作内存其实就是栈,主内存就是堆。

  操作系统中存在可见性问题,解决方案即缓存一致性,比如两个cpu共同加载了一个内存块,A进行读,B进行写,则B会发送一个写广播,在cpu间进行通信,此时写的优先级会大于读的优先级,所以A收到写广播,会将缓存中的变量置为失效,重新从内存中加载该变量。

  那么java线程之间同样存在可见性问题,线程A读取变量value,线程B写变量value,线程B写的变量不一定会立刻同步到主存,线程A读取变量不一定会从主存中读取变量。


java并发浅析第一篇_第1张图片
 

2.java存在哪些并发问题?

   一.指令重排序问题,重排序并不意味着所有程序都是杂乱无章的,重排序只是重排序没有相互依赖的代码。比如构造器中创建对象,但是在还没有初始化完成变量之前就已经return了。

   二.非volatile的64位变量赋值,其它线程可能读取到的是没有操作完成的半个变量

   三.读取到的数据已经失效,已经被其它线程修改了。

 

3.java并发有哪些解决方案?

  一.第一个问题在某些情况下可以使用定义final变量,使指令重排序失效,JMM内存模型要求final类型的变量的初始化动作必须在return之前完成。

  二.第二个问题当然就是指定volatile。后面单独讨论下volatile。

  三.进行加锁的动作

  四.ThreadLocal定义线程内的变量。

 

你可能感兴趣的:(java并发)