同步与异步
同步(Synchronous):指调用者完成前一个方法才能继续后面的行为。(比如:实体店购物,看货、选货、付款、拿货,得一个一个来)
异步(Asynchronous):指调用者调用一个方法后可以立刻返回往下执行,被调用的方法会由其他线程执行。(比如:网上购物,看完选好付款后,你爱干嘛干嘛,货物会有人给你送来)
并发与并行
并发(Concurrency):指任务交替进行,看起来好像是同一时间一起执行的,但其实不是。
并行(Parallelism):指多个任务同时进行处理,是真正意义上的多线程,必须有多核CPU的支持。
临界区
指共享资源,可以被多个线程使用(在这里加锁,就是为了让每次使用该资源的线程数量限制在一个)
死锁、饥饿和活锁
死锁(Deadlock):多个程序彼此占用了其他线程需要的资源,互不相让,导致程序无法往下执行。
饥饿(Starvation):在区分优先级的条件下,高优先级的线程总是插队低优先级的线程,导致低优先级的线程一直没有机会得到资源,则称之为饥饿。
活锁(Livelock):多个线程发现自己占用了其他线程的资源,让出了资源,恰好其他线程也一起让出了资源,出现了一种尴尬的“你让我,我让你”的局面,就是活锁。
并发级别
阻塞(Blocking):因synchronized关键字,重入锁等原因,临界资源区已经被占用,除占用外的其他线程需要使用这个资源java高并发基础必备而不得不挂起等待,则称这种现象为阻塞。

无饥饿(Starvation - Free):公平锁(按先来先得的规则)不产生饥饿,非公平锁(按高优先级优先的规则)则会产生饥饿。
以上两种属于阻塞式调度
无障碍(Obstruction - Free):是最弱的一种非阻塞调度,线程都可以进入临界区,但是发现数据不一致则会使用回滚操作。
无锁(Lock - Free):在无障碍的基础上,设想总是会有一个线程能在有限步内完成操作离开资源区。
无等待(Wait - Free):所有线程,都必须在有限步内完成操作离开资源区。
以上三种属于非阻塞式调度
阻塞式调度和非阻塞式调度
阻塞式调度:使用悲观的策略,认为冲突必定会发生,保护数据为第一。
非阻塞式调度:使用乐观的策略,认为冲突很可能不会发生。
并行要解决的三个关键点
原子性(Atomicity):不可中断的操作为原子操作。(比如int的赋值就是原子操作,而long赋值不是,因为在过程中可以被中断,就有可能造成数据不一致的错误)
可见性(Visibility):其他线程能否知道某个线程是否修改了某一个变量。
有序性(Ordering):指令重排可能会打乱程序的执行顺序。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/5110.html