高并发的几个概念:
1.同步和异步:同步方法调用一旦开始,调用者必须等待方法返回结果后,才能继续后续的执行!异步方法更像一个消息传递,一旦开始,方法调用就会立刻返回,调用者就可以继续后续的操作(不是同一个线程)。
2.并行和并发:并行是真实的多个任务同时执行,而并发是多个任务交替执行!
3.临界区:临界区用来表示一种公告资源或者说是共享数据,可以被多个线程使用,但是每一次只能一个线程使用它,一旦临界区资源被占用,其他线程想使用就必须等待。
即临界区是我们需要保护的对象。
4.阻塞与非阻塞:阻塞和非阻塞说用来形容多线程间的影响的。等一个线程占用了临界区资源,其他线程需要使用这个资源则必须在这个临界区等待,等待会导致线程挂起,这 种。 情况就是阻塞,如果占用资源的线程一直不释放资源,那么其他线程则一直无法工作。
5.死锁,饥饿和活锁:死锁是因为资源被占用导致的,比如线程1占用了线程2的资源,线程2占用了线程3的资源,线程3占用了线程1的资源,他们相互之间无法获取到需要的资源!饥饿是指某一个或者多个线程,因为种种原因无法获取到想要的资源,导致一直无法执行,比如它的优先级可能太低,而高优先级的线程一直抢占它的资源。活锁是因为线程yield(谦让)导致的,多个线程中,线程之间主动释放资源,那么资源在两个线程中不断的跳动,而没有一个线程可以拿到所有资源正常执行。
6.并发级别:由于临界区的存在,多线程之间的并发必须受到控制。大致分为:阻塞,无饥饿,无障碍,无锁,无等待几种!
阻塞:一个线程是阻塞的,那么中其他线程释放资源之前,当前线程是无法执行的。当我们使用synchronized关键字,或者重入锁,我们得到的就是阻塞的线程。
无饥饿:如果线程之间是有优先级的,那么线程的调度总是倾向于优先级高的线程,那么多余同一个资源的分配,肯定是不公平的。对于非公平的锁,系统允许优先级高的线程插队,这样就可能导致线程饥饿,但是如果锁水公平的,那么久遵循先来后到排序获取临界区资源,那么饥饿就不会产生。
JMM:
1.原子性:指一个操作时不可中断的。即使时在多个线程一切执行的时候,一个操作一旦开始,那么就不要被其他线程打扰!
2.可见性:指当一个线程修改了某一个共享的变量,其他线程是否能够立即知道这个修改。多余串行的程序,是不存在这个问题的,指并行程序中,线程不一定知道这个修改。
3.有序性:对于一个线程的执行代码而言,我们总是习惯性的以为程序代码的执行是从先往后,对于一个线程而言,的确如此。但是中并发的时候,程序的执行就可能出现乱序,给人的感觉就是写在前面的代码,会在后面执行。有序性问题的原因是:指令重排。指令重排会保证不会使串行的语义发生逻辑问题,主要是因为多个cpu。
汇编指令的执行:读取IF,择码和取寄存器操作数ID,执行火灾有效地址计算EX,存储器访问MEN,写回WB