Q:什么是数据依赖性?
A:如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。
举个例子:a初始化为0,b初始化为 0,c初始化为 1
写-读:a=1;b=a; //将读写操作顺序调换为b=a;a=1,则结果由a=b=1变为a=1,b=0,所以,写-读操作存在数据依赖。
写-写:a=1;a=2;//存在数据依赖
读-写:a=b;b=1;//存在数据依赖
读-读:a=c;b=c;//不存在数据依赖
单核单线程的顺序执行的程序,编译器和CPU会依据数据依赖性,保证程序的按正确的顺序执行,但是,编译器和CPU对多核或者多线程的场景,不提供默认的数据依赖性,需要码农提供额外的信息,让CPU和编译器做的指令重排序既能提升程序性能,又能保证正确性。在Java中,这些信息就是线程-锁模型提供的各种信号量。
通过改变共享内存变量来通信的模型,最大的痛点在于数据之间的状态依赖。如果都是读操作,并发任务就成了并行,各个处理器中的数据不存在依赖性,不存在诡异的内存问题。涉及写操作的并发场景,之所以复杂,个人觉得问题在于我们试图用代码去模拟真实的世界,而真实的世界是很复杂的,由很庞大的个体组成数据集是多样的,想以个人的脑力,写出能处理所有个体的随机需求的代码,简直就是痴人说梦!我们码农能做的,就是考虑尽可能多的异常情况,做好异常处理和补偿机制。
网友评论