美文网首页js css html
Java中的多线程

Java中的多线程

作者: 在岁月中远行 | 来源:发表于2023-02-18 17:46 被阅读0次

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 解决内存可见性和指令重排序问题(并不保证线程安全)

相关文章

网友评论

    本文标题:Java中的多线程

    本文链接:https://www.haomeiwen.com/subject/rskbkdtx.html