一、之所以在计算机中加入操作系统来实现多个程序的同时执行,主要是基于以下原因:
1、资源利用率:可以同时运行多个程序。
2、公平性:资源共享和同等的使用权。
3、便利性:计算多个任务的时候,编写多个程序,每个程序执行一个任务并在必要的时候通讯,这笔只编写一个程序来计算所有的任务更容易实现。
二、线程带来的风险
1、安全性问题:线程安全性可能是非常复杂的,在没有充足同步的情况下,多个线程中的操作执行顺序是不可预测的,甚至会产生奇怪的结果。
例:
@NotTheadSafe public class UnsafeSequence{ private int value; public int getNext(){ return value++; } }
如果多个线程同时执行 getNext();那么可能返回相同的结果。
修改成线程安全后如下:
@TheadSafe
public class Sequence{
//该注释标识这个变量 受对象内部锁保护
@GuardedBy("this")
private int value;
public synchronized int getNext(){
return value++;
}
}
2、活跃性问题
安全性的含义是“永远不会发生糟糕的事情”,而活跃性则关注于另一个目标,即“某件正确的事总会发生”。当某个操作无法继续执行下去的时候就会发生活跃性问题。
例:如果线程A在等待线程B释放资源,而线程B永远不释放资源,那A就会永远等待下去。
3、性能问题
性能问题包括多个方面,例如服务时间过长,相应不灵敏,吞吐率过低,资源消耗过高,或者可伸缩性较低。
在设计良好的并发应用程序中,线程能提升程序的性能,但无论如何,线程总会带来某种程度上的运行时开销。在多线程程序中,当线程调度器临时挂起活跃县城并转而运行另一个线程时,就会频繁的出现切换上下文操作,这种操作将带来极大的开销:保存和回复执行上下文,丢失局部性,并且CPU时间将更多的话费在线程调度而不是程序运行上。当县城共享数据室,必须使用同步机制,而这些机制往往会一直某些编译器优化,是内存缓存区中的数据无效,一级增加共享内存总线的同步流量。所有这些因素都将带来额外的性能开销。