平日主要是开发企业信息系统,所以使用到多线程的时候不多,但是相关的知识又很多很复杂,所以就在这里做一些总结吧。
我主要做Java为主,这里记录的会是很多跟Java相关,但是我想多线程的问题,很多又是相通的。
先说说多线程的难度吧,这个可以跟多线程相关问题形成的原因有关
- 首先它是因为有共享的可变变量
- 因为代码的执行顺序是可以在编译或执行时优化的,所以以为已经执行的代码,其实还没有执行
通过各种锁的机制可以解决并发问题,但是又有以下的情况需要注意的
- 如果同步的范围太大,那么并发带来的性能提升将不存在
- 如果同步范围缩小,容易因为没有覆盖全需要覆盖的代码而引进Bug
- 如果有多个锁需要获取,且获取锁的顺序在不同的代码段不是一致的,那么就可能引起死锁。
- 另外,还有其他的一些相关的问题就是活锁,饿死和阻塞。
所以加锁需要加的范围刚刚好,且多个锁的获取顺序必须一致来避免加锁。
举几个Java的例子,比较容易出错的。
int a=0;
public void increase() {
a++
}
这块代码并不满足原子性,所以当有多个1000个线程运行上面的代码之后,我们得到的结果并不一定等于1000.
换一下,变成下面的样子
volatile int a = 0;
public void increase() {
a++;
}
<