《Java编程思想》共享受限资源-读书笔记

有了并发就可以同时做多件事情了,但是两个线程或多个线程彼此互相干涉的问题就出现了。

1.不正确的访问资源

一个任务不能依赖于另一个任务,因为任务关闭的顺序无法得到保证。通过使任务依赖于非任务对象,可以消除潜在的竞争条件。因此如果不保护任务,即使单一的递增也是不安全的。

2.解决共享资源竞争

  1. 使用线程时的一个基本问题:你永远都不知道一个线程何时在运行。对于并发工作,你需要某种方式来防止两个任务访问相同的资源,至少在关键阶段不能出现这种情况。
  2. 防止这种冲突的方法就是当资源被一个任务使用时,在其上加锁。基本上所有的并发模式在解决线程冲突问题的时候,都是采用序列化访问共享资源的方案。通常这是通过在代码前面加上一条锁语句来实现的,这使得在一段时间内只有一个任务可以运行这段代码。
  3. Java以提供关键字synchronized的形式,为防止资源冲突提供内置支持。当任务要执行被synchronized关键字保护的代码片段时,它将检查锁是否可用,然后获取锁,执行代码,释放锁。
  4. 如果你正在写一个变量,它可能接下来将被另一个线程读取,或者正在读取一个上一次已经被另一个线程写过的变量,那么你必须使用同步,并且,读写线程都必须用相同的监视器锁同步。每个访问临界共享资源的方法都必须同步,否则它们就不会正确地工作。
  5. 显式的Lock对象在加锁和释放锁方面,相对于内建synchronized锁来说,赋予了你更细粒度的控制力。

3.原子性与易变性

基本上,如果一个域可能会被多个任务同时访问,或者这些任务中至少有一个是写入任务,那么就应该将这个域设置为volatile的。如果将一个域定义为volatile,那么它就会告诉编译器不要执行任何移除读取和写入操作的优化,这些操作的目的是用线程中的局部变量维护对这个域的精确同步。

你可能感兴趣的:(《Java编程思想》共享受限资源-读书笔记)