六、两个重要的概念性问题:
1、同步:要保持数据的一致性,就需要一种保证并发进程正确执行顺序的机制。这种机制就是 进程同步(Process Synchronization)。
竞争资源的多个进程按着特定的顺序执行,目的是使并发执行的进程之间能有效的共享资源和相互合作,从而使程序的执行具有可再现性。(广义)
异步环境下的一组并发进程,因直接制约而互相发送消息而进行相互合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步--张尧学 《计算机操作系统教程》(狭义)
2、线程池:根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。一是为减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。二是可以根据系统的承受能力,调整线程池中工作线线程的数目,防止消耗过多的内存
Java里面线程池的*接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。
关于更多的创建等问题 http://www.oschina.net/question/565065_86540
七、三种方法用于处理状态(一项编程艺术实践活动):共享可变性(shared mutability)方法、隔离可变性(isolated mutability)方法、纯粹不可变性(pure mutability)方法
共享可变性(shared mutability)设计:这是一种极端情况,为了使用此方法,我们必须保证不会有两个线程同时修改同一个字段,并且对多个字段的修改必须满足一致性原则。统计工龄的例子:房间中的每一个人都当成一个线程,我们需要她们共享total的访问进行同步,一个同事的出错将会整体崩溃,我们必须监督多个试图修改数据的总人数(让他们好好排队)并且一个人累加的时候,其他人都得等待。显然,这种方式引入过多的线程,容易出现低并发性。
隔离可变性(isolated mutability)设计:这是一种折中方案,保证任何在多个线程共享的事务保持不变,这一点java容易实现。
统计工龄的例子:将total变量设置为0,屋子里的每个人都看成是一个线程,包括我自己在内,每个线程只是简单的发送消息(自己的工龄),然后由我相加,每个人不共享这个total,我是唯一可以改变total的人,此不涉及同步问题。如果我们保证共享数据是不可变的或者可变是可以隔离的,那么我们认为此问题不涉及同步。
纯粹不可变性(pure mutability)设计:这是另一种极端情况,这种情况下,所有的事物都是不可变的。
统计工龄的例子:让屋子里的人组成一个人链,然后一个人告诉其左边的人,然后由其左边的人累加再告诉其左边的人,我必须告诉我左边的人,因为他正着急的等待,由最后一个人统计total。这个情况下与并发无关。如果人数过多,我们可一分组或者成树形。