1 什么是多线程
在一个进程中,同时运行多个线程,用来完成不同的工作,则称为多线程。注意:
很多多线程都是模拟出来的,真正的多线程是指有多个CPU,即多核。如果是模拟出来的多线程,即在一个CPU的情况下,在同一个时间点,CPU只能只能执行一个代码,因为切换的很快,所有就有同时执行的感觉。实际就是多个线程交替占用CPU资源。
2 为什么要用多线程
充分利用CPU资源,提高资源利用率。提高效率。
3 什么是线程安全,
多个线程同一时刻对同一个全局(共享)变量进行写操作(读操作不会涉及到线程安全)时,如果跟我们预期的结果一样,我们就称为线程安全,反之,就是线程不安全。
4 多线程为啥有线程安全问题
4.1 线程是一个抢占式执行的过程(具有随机性)。这是由操作系统内核来实现的,程序员无法控制。
4.2 由于多个线程修改共享变量(局部变量,final变量是没有线程安全问题的)。
4.3 修改操作不是原子性的。(可能会有多条指令,在执行过程中相互穿插,也就无法保证线程的安全)
原子性:即一个操作或者多个操作,要么全部执行,并且执行的过程不会被任何因素打断,要么就都不执行。
x = 10; //语句1
y = x; //语句
2x++; //语句3
x = x + 1; //语句4
这里面只有语句1是原子操作,也就是说单步的读取,赋值才是原子操作。(而且必须是数字赋值给某个变量,变量之间的相互赋值不是原子操作)
4.4 内存的可见性:
两个线程同时操作一个内存,一个读内存,一个写内存;写操作的线程进行修改的时候,读线程可能读取到的都是修改之前的值,也有可能读取到的是修改后的值,任然存在不确定性,这也会带来线程不安全。
4.5 指令重排序:
为了让程序跑的更快,CPU调整了执行指令与指令之间的顺序(编译器的优化,是自己调整的)来提高运行的效率(逻辑不发生改变)。
这个也和线程不安全相关,如果是单线程没问题,但多线程的话可能就会有线程安全问题。
5 线程安全怎么解决
同步锁synchronized
Lock
volatile 解决内存可见性和指令重排序问题(并不保证线程安全)
网友评论