多线程编程--心得

概念:

 (一).临界区

  临界区用来表示一种公共资源,或者说是一种共享数据。它可以被多个线程使用,但是每一次只能有一个线程能使用它。一旦临界区被占有,那么其他的线程只能等待。

  (二).死锁(Deadlock),活锁(Livelock),饥饿(Starvation)

    死锁是表示当多个线程互相持有对方所需要的锁,并一直等待的场景。假如有2个线程 A,B。当线程A在执行的过程中持有锁A,并且向下执行程序时需要锁B,那么线程A会等待锁B的释放。这个时候,恰巧线程B持有锁B,并释放的条件的需要持有锁A,那么线程A与B 都会僵持,等待对方释放。这样的场景就产生了死锁。

    饥饿是表示,当某一个或者多个线程,由于某些原因(可能是由于优先级,或者一直在等待某个锁的释放等场景)迟迟无法获得所需要的资源的时候,就会产生饥饿。虽然线程的优先级并没法明确的功控制,但是饥饿的情况却时常发生。当然饥饿与死锁比起来,那就是饥饿在将来的某个时间肯定会被执行。

    活锁的情况恰恰与上述2中情况不同,上面2种情况是想要却不可得。偏偏活锁却是一种互相谦让的状态。可以想象一个画面,当在大街上碰到一个迎面走来的人时,你会下意识的往左或者往右避免与对方相撞,但在这个时候对方也同时的往左或者往右,恰好与你的动作匹配上,然后2人各自左右谦让,导致一直过不去的场景!!这就是活锁。由于计算机没有人类的那么灵活只会死脑筋的不停谦让,导致资源一直在双方线程内来回跳动,双方都没有持有。

  (三).原子性

    原子性是指一个操作是不可中断的,即使是在多个线程一起执行的时候,一个操作开始就不会被其他操作所干扰。

    比如有一个全局的变量 int i,现在有两个线程同时对它赋值,线程A 赋值给1, 线程B 赋值给-1。那么i的值只有2种可能,要么是1 要么是-1。线程A 与线程B 它们之间是没有干扰的,是不可被中断的,这个就是所谓的原子性。

    

原文地址:https://www.cnblogs.com/culushitai/p/11345819.html