wordpress customize,邵阳网站建设优化,在线制作h5网页,北京专业网页制作公司基本概念
同步和异步
同步和异步通常是用来形容一次方法调用。
同步方法调用一旦开始#xff0c;调用者必须等到方法返回才能继续执行后续操作。
异步方法调用更像一个消息传递#xff0c;一旦开始#xff0c;方法调用就会立即返回#xff0c;调用者就可以继续后续的操…基本概念
同步和异步
同步和异步通常是用来形容一次方法调用。
同步方法调用一旦开始调用者必须等到方法返回才能继续执行后续操作。
异步方法调用更像一个消息传递一旦开始方法调用就会立即返回调用者就可以继续后续的操作。异步方法通常会在另外一个线程中真实执行整个过程不会影响调用者的工作。
举例到了饭点我们点外卖下单成功之后等待外卖小哥送餐。这就是同步调用。 不过为了学习我们在下单成功之后看了会《Java 从入门到放弃》书籍边等待外卖小哥送餐。这就是异步调用。
并发和并行
并发和并行两个概念很容易被混淆。他们都可以表示两个或者多个任务一起执行但是偏重点有些不同。并发偏重于多个任务交替执行而多个任务之间有可能还是串行的。而并行是真正意义上的同时执行。 严格来说并行的多个任务是真实的同时执行而对于并发来说这个过程值是交替执行。一会儿执行A一会儿执行B系统会不停地在两者间切换。但是对于外部观察者来说即使多个任务之间是串行并发的也会造成多任务间是并行执行的错觉。
举例三个人同时吃三个苹果这句是并行。而一个吃三个苹果这就是并发他需要来回切换。
临界区
临界区用来表示一种公共资源或者说是共享数据可以被多个线程使用。但是每一次只能有一个线程使用它一旦临界区资源被占用其他线程想要使用这个资源则必须等待。
举例会议室开会当有人正在使用会议室而这个时候你又想要使用这个会议室就必须等他们会议结束才能使用。
阻塞和非阻塞
阻塞和非阻塞通常是用来形容多线程间的相互影响。比如当临界区资源被占用时那么其他需要需要使用这个临界区资源的线程就必须等待等待会导致线程挂起这种情况就是阻塞。非阻塞的意思与之相反它强调没有一个线程可以妨碍其他线程执行。
死锁、饥饿、和活锁
死锁、饥饿和活锁都属于多线程的活跃性问题。
死锁多个进程对公共资源的相互竞争导致循环等待的现象。比如A-B-C-A互相竞争循环等待。
饥饿指某一个线程或者多个线程因为某种原因无法获得所需要的资源导致一直无法执行。比如线程优先级低导致高优先级的线程不断抢占它需要的资源导致低优先级的线程无法工作。举例在自然界中母鸟喂食。由于雏鸟很多而食物有限雏鸟之间的事务竞争可能非常厉害小雏鸟因为经常抢不到食物有可能会被饿死。
活锁活锁恰恰与死锁相反死锁是大家都拿不到资源都占用着对方的资源而活锁是拿到资源却又相互释放不执行。当多线程中出现了相互谦让都主动将资源释放给别的线程使用这样这个资源在多个线程之间跳动而又得不到执行这就是活锁。举例两个人迎面走来时有时候因为有事比较急而为了快速通过会避让对方先行。恰好对方也为了能快速通过礼让你先行结果撞上了。于是乎都意识到了这个问题希望尽快避让对方你向右他向左结果又撞上了。
并发级别
由于临界区的存在多线程之间的并发必须收到控制。根据控制并发的策略对并发的级别进行分类大致为阻塞无饥饿无障碍、无锁、无等待。
阻塞
一个线程是阻塞的那么在其他线程释放资源之前当前线程无法继续执行。当使用 Synchronized 关键字或者重入锁时我们得到的就是阻塞线程。
无饥饿
如果线程之间是有优先级的那么线程调度的时候总是会倾向于满足高优先级的线程。也就是说对于同一个资源的分配是不公平的。那就出现了公平和非公平两种情况。对于非公平锁来说系统允许优先级高的线程插队。这样有可能导致优先级低的线程产生饥饿。但如果锁是公平的满足先来后到那么接就不会产生不论新来的线程优先级高低想要获得资源就必须乖乖排队那么所有的线程都有机会执行。
无障碍
无障碍是一种最弱的非阻塞调度。两个线程如果是无障碍的执行那么他们不会因为临界区的问题导致一方被挂起。换言之大家都可以大摇大摆地进入临界区了。对于无障碍的线程来说一旦检测到数据被修改坏了它会立即对自己所做的修改进行回滚确保数据的安全。
如果说阻塞的控制方式是悲观策略那么非阻塞的调度就是一种乐观的策略。它任务多个线程之间很有可能不会发生冲突或者说这种概率不大。因此大家都应该无障碍的执行但是一旦检测到冲突就应该进行回滚。但是无障碍的多线程程序并不一定能够顺畅的运行因为当临界区中存在严重的冲突时所有的线程可能都会不断地回滚自己的操作而没有一个线程可以走出临界区。这种情况会影响系统的正常执行。所有我们希望在这一堆线程中至少有一个线程能够在有效的时间内完成自己的操作从而退出临界区。至少这样可以保证系统不会在临界区中进行无线的等待。
一种可行的无障碍实现可以依赖一个一致性标记来实现。线程在操作之前线程读取并保存这个标记在操作完成后在此读取检查这个标记是否被更改过如果两者是一致的则的说明资源访问没有冲突。如果不一致则说明资源可能在操作过程中与其他线程冲突需要重试操作。
无锁
无锁的并行都是无障碍的。在无锁的情况下所有的线程都能尝试对临界区进行访问但是不同的是无锁的并发保证必然有一个线程能够在有限步内完成操作离开临界区。
无等待
无锁只要求有一个线程可以在有限步内完成操作而无等待则是在无锁的基础上更进一步进行扩展。它要求所有的线程都必须在有限步内完成这样就不会引起饥饿问题。如果限制这个步骤上限还可以进一步分解为有界无等待和线程数无关的无等待几种他们之间的区别只是对循环次数的限制不同。