多线程编程--心得
概念: (一).临界区 临界区用来表示一种公共资源,或者说是一种共享数据。它可以被多个线程使用,但是每一次只能有一个线程能使用它。一旦临界区被占有,那么其他的线程只能等待。 ?(二).死锁(Deadlock),活锁(Livelock),饥饿(Starvation) ??死锁是表示当多个线程互相持有对方所需要的锁,并一直等待的场景。假如有2个线程 A,B。当线程A在执行的过程中持有锁A,并且向下执行程序时需要锁B,那么线程A会等待锁B的释放。这个时候,恰巧线程B持有锁B,并释放的条件的需要持有锁A,那么线程A与B 都会僵持,等待对方释放。这样的场景就产生了死锁。 ? 饥饿是表示,当某一个或者多个线程,由于某些原因(可能是由于优先级,或者一直在等待某个锁的释放等场景)迟迟无法获得所需要的资源的时候,就会产生饥饿。虽然线程的优先级并没法明确的功控制,但是饥饿的情况却时常发生。当然饥饿与死锁比起来,那就是饥饿在将来的某个时间肯定会被执行。 ? 活锁的情况恰恰与上述2中情况不同,上面2种情况是想要却不可得。偏偏活锁却是一种互相谦让的状态。可以想象一个画面,当在大街上碰到一个迎面走来的人时,你会下意识的往左或者往右避免与对方相撞,但在这个时候对方也同时的往左或者往右,恰好与你的动作匹配上,然后2人各自左右谦让,导致一直过不去的场景!!这就是活锁。由于计算机没有人类的那么灵活只会死脑筋的不停谦让,导致资源一直在双方线程内来回跳动,双方都没有持有。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Java虚拟机详解(四)------垃圾收集器
- java – 为什么新的线程而不是将来{…}
- java五种排序算法汇总工具类
- java – Spring在运行时添加外部spring上下文
- Java concurrency集合之ConcurrentSkipListMap_动力节点Jav
- java – Jena TDB:嵌套事务
- java – 使用TexturePaint的图标抛出InternalError:Surfac
- java – 自定义WebArgumentResolver,如@PathVariable
- java 计算器 (模仿windows自带计算器的功能和界面)
- java – 使用write.xlsx将现有工作表替换为R包xlsx