前言
前面也说了,
学习Netty的基础,那就是Nio,昨天我们简单的过了一下BIO,这是我们Java IO的基础,在JDK1.4之前的主要的io方式。
今天开始,我们就开始把NIO的一些东西了解清楚,之后才是Netty ,
因为我们的Netty是基础NIO的一个框架嘛,下面就来详细说说。
并发编程三大特性
原子性
一个操作或者多次操作,要么所有的操作全部都得到执行并且不会受到任何因素的干扰而中断,要么所有的操作都执行,要么都不执行。
对于基本数据类型的访问,读写都是原子性的【long和double可能例外】。
如果需要更大范围的原子性保证,可以使用synchronized关键字满足。
可见性
当一个变量对共享变量进行了修改,另外的线程都能立即看到修改后的最新值。
volatile
保证共享变量可见性,除此之外,synchronized
和final
都可以 实现可见性。
synchronized
:对一个变量执行unclock之前,必须先把此变量同步回主内存中。
final
:被final修饰的字段在构造器中一旦被初始化完成,并且构造器没有把this的引用传递出去,其他线程中就能够看见final字段的值。
有序性
即程序执行的顺序按照代码的先后顺序执行【由于指令重排序的存在,Java 在编译器以及运行期间对输入代码进行优化,代码的执行顺序未必就是编写代码时候的顺序】,volatile
通过禁止指令重排序保证有序性,除此之外,synchronized
关键字也可以保证有序性,由【一个变量在同一时刻只允许一条线程对其进行lock操作】这条规则获得。
CPU缓存模型是什么
高速缓存为何出现?
计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的**临时数据是存放在主存(物理内存)**当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。
为了解决CPU处理速度和内存不匹配的问题,CPU Cache出现了。
图源:JavaGuide
缓存一致性问题
当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将