码迷,mamicode.com
首页 > 编程语言 > 详细

《Java虚拟机并发编程》学习笔记

时间:2016-06-28 20:34:07      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

   对《Java虚拟机并发编程》这本书真的是相见恨晚。以前对并发编程只是懂个皮毛,这本书让我对并发编程有了一个全新的认识。所以把书上的知识点做下笔记,以便以后复习使用。

并发与并行

  仔细说来,并发和并行是两个不同的概念。但随着多核处理器的普及,并发程序的不同的线程往往会被编译器分配到不同处理器核心上,所以说并发编程与并行对于上层程序员来说是一样的。

 

并发的风险

饥饿

  当一个线程等待某个需要运行时间很长或者永远无法完成的时间发发生,那么这个线程就会陷入饥饿状态。通常饥饿也会被叫做活锁。

  解决饥饿的方法是设计一个等待超时策略,让线程等待有限的时间

死锁

  两个或多个线程互相等待对方释放所占用的资源或执行的某些动作。

 竞争条件

  竞争条件指两个线程竞争使用相同的资源或者数据。

  造成竞争条件的主要原因是:Just-In-Time(JIT)编译器优化以及Java内存模型。

 

内存栅栏

  内存栅栏(Memory Barrier)指从本地缓存(或寄存机)或工作内存到主存之间的拷贝动作。在程序运行过程中,所有的变更会先在寄存器或本地cache中完成,然后才会被拷贝到主存以跨越内存栅栏。这种跨越顺序称为happens-before。

  写操作必须happens-before读操作,即写操作需要在所有读线程跨越内存栅栏之前完成自己的跨越动作,其所作的变更才能对其他线程可见。

  Java并发API中由很多操作都隐含有跨越内存栅栏的含义:volatile、sychronized、Thread中的start()和interrupt()、ExecutorService中的函数以及向CountDown这样的同步工具。

 

volidate

  关键字volidate的作用是告知JIT编译器不要对标记变量执行任何可能影响其访顺序的优化,而且对该变量的读写访问都需要忽略本地cache并直接对内存进行操作。但会使每次变更访问都要跨越内存栅栏并最终导致程序性能下降。此外在多个字段被多个线程并发访问得场景下,由于针对每个volidate字段的访问都是各自独立处理的,并且无法将这些访问统一协调成一次访问,所以volatile关键字无法保证整体操作的原子性。

  解决方法是屏蔽对变量的直接访问,并将所有访问都引导为通过同步的getter和setter方法。

 

《Java虚拟机并发编程》学习笔记

标签:

原文地址:http://www.cnblogs.com/fengzhiwu/p/5624284.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!