前提知识
什么是并发?什么是并行?它们最终的目标是什么?
并发
并发某一时间段内,存在多个任务一起无顺序的交替执行,由于任务与任务之间的切换时间极短用户不容易感知,这种情况叫做并发
并行
并行某一时间段内,多个任务一起执行,这种情况叫并行
- 最终的目标
最大化CPU使用率
并发三大特性
并发编程BUG的根源就是三大特性:原子性、可见性、有序性
原子性
原子性则是一个操作或者多个操作之间不可被打断,要么都执行,要么都不执行
例如:
A用户银行转账1000元给B用户
操作1:A账户-1000元
操作2:B账户+1000元
操作1与操作2要么都执行,要么都不执行,中间不能被打断,否则AB账户上的钱则对应不上
可见性
可见性:一个线程对共享变量值的修改,能够及时被其他线程看到
public class Test {
private static boolean isStop = true;
private static int count = 0;
public static void main(String[] args) {
new Thread(() ->{
if(isStop){
while (true){
System.out.println(count++);
}
}
},"线程1").start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() ->{
isStop = false;
},"线程2").start();
}
}
上面案例中线程2对共享变量isStop进行修改,线程1对isStop修改后的值应该可见
有序性
有序性:由于java程序是由指令从上到下执行,编译器和处理器会遵守数据依赖性,不会改变存在数据依赖性关系的操作的执行顺序,编译器和处理器在不影响结果的前提下会对指令进行重新排序
public class Test {
private static boolean isStop = true;
private static int count = 0;
public static void main(String[] args) {
int a = 10;
int c = 9;
int b = 5;
int d = a+b;
//可能变换成
int a = 10;
int b = 5;
int d = a+b;
int c = 9;
}
}