《java高并发程序设计》读书笔记(1)

时间:2021-10-04 23:51:18

并发几个重要的概念

同步&异步

二者一般都指方法的调用,同步方法一旦调用开始,调用者必须等到方法调用返回后才能继续后续的行为,异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者可以继续后续的操作。而异步方法通常会在另外一个线程中“真实”地执行。

  • 临界区:表示公共资源或者共享数据,可以被多个线程使用
  • 阻塞&非阻塞:形容多线程间的相互影响。
  • 阻塞:比如一个线程占用了临界区资源,那么其他的所有需要这个资源的线程就必须在这个临界区中等待。
  • 非阻塞:没有一个线程可以妨碍其他线程执行,所有的线程都会尝试不断前向执行。
死锁&饥饿&活锁
  • 死锁:互相占用彼此资源导致双方线程都处于等待状态。
  • 活锁:互相释放资源导致双方线程都处于不断释放资源(两人相遇,两人同时向一个方向让路,次过程不断重复)
  • 饥饿:某一个或者多个线程因为种种原因无法获取所需要的资源导致一直无法执行。

并发级别

  • 阻塞:一个线程是阻塞的,那么其他线程在释放资源之前,当前线程无法继续执行,比如程序中利用锁得到的就是阻塞的线程。
  • 无饥饿:如果线程之间有优先级,那么线程调度总是倾向于高优先级的线程,换言之,对于同一个资源分配是不公平的!这样就有可能导致饥饿,如果锁公平就饥饿就不会产生。
  • 无障碍:最弱的非阻塞调度。两个线程是无障碍的执行,那么他们就不会因为临界区的问题导致一方被挂起。是一种悲观策略。
  • 无锁:所有线程都能尝试对临界区进行访问,但不同的是,无锁的并发必然有一个线程能在有限步内完成操作离开临界区。
  • 无等待:所有线程都必须在有限步内完成对临界区的访问。

有关并行的两个重要定律

  • Amdahl定律
Tn = T1(F+n/1(1-F))

n:处理器的个数
F:串行比例
1-F:并行比例

S(n)=T1/Tn=T1/T1(F+1/n(1-F))=1/F+ 1/n (1-F)

S(n):加速比
- Gustafason定律

S(n) = n-F(n-1)

java中的并行世界

  • 原子性:指一个操作是不可中断的,即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰,cpu不能分时间片给其他线程在这个操作执行期间。
  • 可见性:指一个线程修改了某个共享变量的值,其他线程是否也能够立即知道这个修改。
  • 有序性:是否可以指令重排。