JAVA虚拟机并发编程读书笔记——第一部分 并发策略 第1章 并发的威力与风险

线程:程序的执行流程
并发程序是指使用了多线程或多个并发执行流程的应用程序。
单核处理器:并发任务通常指多工或多任务执行方式。也就是说,该单核处理器将会不断地在多个执行流程中进行上下文切换,但任意时刻有且只有一个线程能够被执行。而一个多核处理器,在任意时刻可以有多个执行流程被执行,可并发执行的线程数取决于处理器的可用内核数,而应用程序的并发线程数则取决于与该进程相关联的处理器内存数。

并发的威力
优点:提高响应速度、减少等待时间并增加吞吐量。充分利用多核处理器的性能优势以及多任务并发的方法。

计时任务:启用一个额外的线程或一个timer(timer会在一个新线程中执行)并把计时任务分配给它,同时释放主线程
tips: 应用程序也可以提前预估用户下一步可能执行的操作并提前完成其中的关键动作来提高响应速度,如索引或缓存一些用户所需的数据等。
服务程序,计算密集型应用程序,数据分析程序

并发的风险
饥饿:当一个线程需要等待某个运行很长时间或永远无法完成的事件发生时,线程就会陷入饥饿。
策略:等待超时
死锁:两个或多个线程相互等待对方释放所占用的资源或执行某些动作。
策略:等待超时(可能重蹈覆辙) JConsole工具检测死锁 更好的方案是避免显示加锁以及避免使用可变状态
竞争条件:如果有两个线程竞争使用(包括读)相同的资源或数据
产生原因:Just-In-Time(JIT)编译器的优化以及Java内存模型 ---->《Java Concurrency In Practice》

win7/32默认是client模式运行 java -server RaceCondition
Mac上默认是server模式运行 java -d32 RaceCondition
一个烂程序可能在某些情况下工作正常而在另外一些情况下会失败。

了解可见性:理解内存栅栏
关键字volatile的作用是告知JIT编译器不要对被标记变量执行任何可能影响其访问顺序的优化。任何对该变量的读写访问都需要忽略本地cache并直接对内存操作。对很多变量使用volatile会使每次访问变量都要跨越内存栅并最终导致程序性能下降。此外,在多个字段被多个线程并发访问的情况下,由于针对每个Volatile字段的访问都是各自处理的,并且也无法协调成一次访问,所以Volatile关键字无法保证整体操作的原子性。后果是:线程很可能某些字段只能看到中间结果,而另一些变量则看到最终的结果。为了解决这个问题可以用synchronized修饰的getter,setter函数来进行。
Synchronized是为数不多的几个可以令线程在进入和离开同步区块时都跨越内存栅栏的原语之一。

内存栅栏:memory barrier就是从本地或工作内存到主存之间的拷贝动作。
仅当写操作线程先跨越内存栅栏而读线程后跨越内存栅栏的情况下,写操作线程所做的变更才对其他线程可见。关键字synchronized和volatile都强制规定了所有的变更必须全局可见。在程序的运行过程中,所有的变更会先在寄存器或本地cache中完成,然后才会被拷贝到主存以跨越内存栅栏。此种跨越序列或顺序称为happens-before,写操作必须要happens-before,其所做的变更才能对其他线程可见。

跨越内存栅栏API:volatile、synchronized、Thread.start()、Thread.interrupt()、ExecutorService中的函数以及像CountDownLatch这样的工具类。

规避共享可见性:
《Effective Java》中建议将不可变性引入到并发编程中而从根本上规避上面所提到的那些难题。
每当一个线程更改了一个非final的字段的时候,我们都需要考虑是应该将变更后的值写回内存还是保留在寄存器/cache中。每当读该字段的时候,都需要关心所读到的内容究竟是最新有效值还是cache中的旧的过期结果。同时,还需要确保对该变量的变更是原子的,即其它线程不会看到中间结果。此外还需要处理多个线程同时更改同一数据。
final:任何线程都可以读取final变量的值,这个值就是变量保存在cache中的值的拷贝。由于值是不可变的,所以后续的访问只要从本地cache中获取就好了,而且性能更好。
面向不可变性编程:
1.对可变状态进行严密的封装并只共享不可变的数据。
2.纯函数语言提供的方案:除了可使用函数组合之外,程序中一切事物都设定为不可变的。
3.使用一个可以监控所有变化并在出现任何违规行为时我们发出警告的库来规避可变性所带来的问题。

后续讨论几种用于确定线程数量和分解任务的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值