摘录自 极客时间

合适的线程数量

对于CPU密集型计算场景,“线程的数量=CPU核数”就是最合适的。但是工程上一般会设置成“CPU核数+1”。

对于I/O密集型计算场景,最佳的线程数为

上面这个单核CPU,但是对于多核CPU,只要扩大比例即可:

局部变量是线程安全的

对下面的代码,当多个线程调用fibonacci()这个方法的时候,数组r是否存在数据竞争?

1
2
3
4
5
6
7
8
9
10
11
12
// 返回斐波那契数列
int[] fibonacci(int n) {
// 创建结果数组
int[] r = new int[n];
// 初始化第一、第二个数
r[0] = r[1] = 1; // ①
// 计算 2..n
for(int i = 2; i < n; i++) {
r[i] = r[i-2] + r[i-1];
}
return r;
}

当然不会,因为局部变量是线程安全的。
原因如下图所示:
p1
p2

线程封闭

局部变量不会与其他线程共享,所以出现了线程封闭的技术。
从数据库连接池里面获取的连接Connection保证一个Connection一旦被一个线程获取之后,这个线程关闭Connection之前这段时间不会再分配给其他线程,从而保证了没有并发问题。