快速了解《实战Java高并发程序设计》的一些概念

同步与异步

同步(Synchronous):指调用者完成前一个方法才能继续后面的行为。(比如:实体店购物,看货、选货、付款、拿货,得一个一个来)

异步(Asynchronous):指调用者调用一个方法后可以立刻返回往下执行,被调用的方法会由其他线程执行。(比如:网上购物,看完选好付款后,你爱干嘛干嘛,货物会有人给你送来)


并发与并行

并发(Concurrency):指任务交替进行,看起来好像是同一时间一起执行的,但其实不是。

并行(Parallelism):指多个任务同时进行处理,是真正意义上的多线程,必须有多核CPU的支持。


临界区

指共享资源,可以被多个线程使用(在这里加锁,就是为了让每次使用该资源的线程数量限制在一个)


死锁、饥饿和活锁

死锁(Deadlock):多个程序彼此占用了其他线程需要的资源,互不相让,导致程序无法往下执行。

饥饿(Starvation):在区分优先级的条件下,高优先级的线程总是插队低优先级的线程,导致低优先级的线程一直没有机会得到资源,则称之为饥饿。

活锁(Livelock):多个线程发现自己占用了其他线程的资源,让出了资源,恰好其他线程也一起让出了资源,出现了一种尴尬的“你让我,我让你”的局面,就是活锁。


并发级别

阻塞(Blocking):因synchronized关键字,重入锁等原因,临界资源区已经被占用,除占用外的其他线程需要使用这个资源而不得不挂起等待,则称这种现象为阻塞。

无饥饿(Starvation - Free):公平锁(按先来先得的规则)不产生饥饿,非公平锁(按高优先级优先的规则)则会产生饥饿。

以上两种属于阻塞式调度

无障碍(Obstruction - Free):是最弱的一种非阻塞调度,线程都可以进入临界区,但是发现数据不一致则会使用回滚操作。

无锁(Lock - Free):在无障碍的基础上,设想总是会有一个线程能在有限步内完成操作离开资源区。

无等待(Wait - Free):所有线程,都必须在有限步内完成操作离开资源区。

以上三种属于非阻塞式调度


阻塞式调度和非阻塞式调度

阻塞式调度:使用悲观的策略,认为冲突必定会发生,保护数据为第一。

非阻塞式调度:使用乐观的策略,认为冲突很可能不会发生。


并行要解决的三个关键点

原子性(Atomicity):不可中断的操作为原子操作。(比如int的赋值就是原子操作,而long赋值不是,因为在过程中可以被中断,就有可能造成数据不一致的错误)

可见性(Visibility):其他线程能否知道某个线程是否修改了某一个变量。

有序性(Ordering):指令重排可能会打乱程序的执行顺序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章