一. 多线程的优势:
GUI线程可以提高用户界面的响应灵敏度
服务器中,提升资源利用率以及系统吞吐率
简化JVM的实现
发挥多处理器的强大力量
建模的简单性
异步事件的处理简化
二. 线程带来的风险
1.安全性问题:
例如非线程安全的数值生成器:
public class UnsafeSequence {
private int value;
public int getNext(){
return value++;
}
}
测试代码:
final UnsafeSequence ufs = new UnsafeSequence();
boolean a[] = new boolean[10000];
boolean b[] = new boolean[10000];
new Thread(){
public void run() {
for(int i = 0;i<10000;i++){
a[ufs.getNext()] = true;
}
};
}.start();
for(int i = 0;i<10000;i++){
b[ufs.getNext()] = true;
}
for(int i = 0;i<a.length;i++){
if(a[i]==b[i])
System.out.println(i);
}
执行过程:
时间:(0.001ms)
0-->1-->2-->3-->4-->5--6-->7-->8
A: value=9 9+1=10 value=10
B: value=9 9+1=10 value=10
线程安全的数值序列生成器
public class Sequence {
private int value;
public synchronized int getNext(){
return value++;
}
}
2.活跃性问题:
例如:线程A等待线程B释放其持有资源,而线程B永远都不释放该资源,那么A将会永远等待下去.
活跃性问题包括:死锁,饥饿,活锁.
3.性能问题:
例如: 服务时间过长,响应不灵敏,吞吐率过低,资源消耗过高,或者可伸缩性较低等.
当线程共享数据时,必须使用同步机制,而这些机制往往会抑制某些编译器的优化,是内存缓存区中的数据无效,以及增加内存总线的同步流量.