程序的并发性分享

最近在学习程序并发性的知识,在这里整理一下:

定义:

并发与并行的概念一直非常相似,不同的人也有不同的理解。而关于并发,最被人们认可的定义是:在单个处理器上采用单核执行多个任务。这样的话,任务调度程序很快便可以从一个调到另一个,因此所有任务看起来都是一个时间段内运行的。而对于并行来说:同一时间在不同的计算机、处理器或者处理器核心上同时运行多个任务。所以,伴随着多核处理器的发展,两者会越来越相似。

并发中,最重要的便是同步,有控制同步与数据访问同步,控制同步就是当两个任务有依赖关系时,运行的次序不可颠倒,而数据访问的同步就是对共享变量的访问限制为1;目前最流行的同步机制有信号量机制(semaphore)和监视器机制。信号量机制是一种用于控制对一个或多个单位资源进行访问的机制。它有一个用于存放可用资源数量的变量,并且可以用两种原子操作来管理该变量的值。互斥(mutex)是一种特殊的信号量,它只能取两个值(即资源空闲和资源忙),而且只有将其设置为忙的进程才可以释放它。互斥可以通过保护临界区来帮助你避免出现竞争条件。监视器机制是一种在共享资源之上的机制。它有一个互斥、一个条件变量、(等待条件和通报条件)。一旦你通报了该条件,在等待它的任务中只有一个会继续执行。还有一个概念便是线程安全,如果共享数据的所有用户都受到同步机制的保护,那么该方法或者对象便是线程安全的。Java中的String对象是一种特殊的不可变对象,它是线程安全的。

多任务之间通信的方法主要有两种:共享内存,消息传递。第一种方法一般是在一台电脑上,任务在读写变量的时候使用相同的内存区域。第二种方法一般是多台电脑上。当一个任务需要与另一个任务通信时,他会先发送一个遵循预定义协议的消息。如果发送方发出消息后继续执行自己的任务流程,那么该通信是异步的;若发送方发出后阻塞等待响应,那么说该通信是异步的。

并发程序设计不是轻松的,经常会出现种种的

问题:
1.数据竞争问题:一个以上的任务在临界区以外对一个变量进行读写操作。

  private int rel;

  public void modify(int diff){

    rel += diff;

  }

  当程序中不同的任务同时执行modify方法时,便会因为时效性导致rel值不符合预期。

2.死锁问题:满足Coffman条件时便会出现死锁的现象。互斥、占有并等待、不可剥夺、循环等待,此时便会出现多个线程对共享资源的矛盾。

3.活锁问题:两个线程:线程1、线程2,两个资源:资源1、资源2,当线程1对资源1加了锁,线程2 对资源2加了锁,然后互相需要对方的资源来延续,它们得不到所需资源便会释放然后重新运行,然后还是上面那种情况。

4.优先级反转:当一个低优先级的任务持有了一个高优先级的任务所需资源时便会发生优先级反转,低优先级先执行。

猜你喜欢

转载自www.cnblogs.com/WeNeverGiveup/p/11753276.html