Java高并发基础概念

时间:2022-03-22 18:02:29

同步和异步通常用来形容一次方法的调用。同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用,就会立即返回,调用者就可以继续后续的操作。异步方法通常会在另外一个线程中“真实”地执行。整个过程,不会阻碍调用者的工作。


并发和并行:都可以表示两个或者多个任务一起执行,并发偏重于多个任务交替执行,而多个任务之间有可能还是串行的。而并行是真正意义上的“同时执行”。


临界区:表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。在并行程序中,临界区资源是保护的对象。


阻塞和非阻塞:通常用来形容线程间的相互影响。如果一个线程占用了临界区资源,那么其他所有需要这个资源的线程就必须在这个临界区中进行等待。等待会导致线程挂起,这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其他所有阻塞在这个临界区上的线程都不能工作。非阻塞强调没有一个线程可以妨碍其他线程执行。所有的线程都会尝试不断前向执行。


死锁、饥饿、活锁:都属于多线程的活跃问题。如果发现上述几种情况,那么相关线程可能就不再活跃,也就说它可能很难继续再继续往下执行。

死锁:互相等待对方释放资源,导致都不能得到自己想要的资源,从而无法继续执行下去。

饥饿:指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。原因可能是优先级太低,或者说一直得不到想要的资源。与死锁相比,饥饿还是有可能在未来一段时间内解决的。

活锁:线程都秉着“谦让”的原则,主动将资源释放给他人使用,那么就会出现资源一直在两个线程间跳动,而没有一个线程可以同时拿到所有资源而正常执行。



并发级别阻塞、无饥饿、无障碍、无等待
阻塞:如果线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。当我们使用Synchronized关键字,或者重入锁时,我们得到的就是阻塞的线程。

无饥饿:先来后到的线程执行顺序(公平),要想获得资源,就必须排队。

无障碍:最弱的非阻塞调度。两个线程如果是无阻碍的执行,那么他们不会因为临界区的问题导致一方被挂起。如果大家一起修改共享数据,把数据改坏了,对于无障碍线程来说,一旦检测到这种情况发生就会对自己所做的修改进行回滚,确保数据安全。那么如果没有数据竞争发生,线程就可以顺利地完成自己的工作,走出临界区。

无锁:无锁的并行都是无障碍的。在无锁的情况下,所有的线程都能尝试对临界区进行访问,但不同的是,无锁的并发保证必然有一个线程能够在有限步内完成操作离开临界区。

无等待:要求所有的线程都必须在有限步内完成。


JMM:Java的内存模型。JMM的关键技术点都是围绕着多线程的原子性、可见性和有序性来建立的