线程同步
2013-10-10 20:28
239 查看
线程,最重要的功能是实现多任务处理,即多线程。在主线程上多个线程在逻辑上“同时”执行,而无需理会是否在物理上的“同时”执行。由此带来线程调度、同步的问题。
一、线程的同步,synchronized,简单地说,几个人要进入一间房间,房间里有临界资源,那些线程要访问的资源,整个房间就一 个临界区。人就是线程,在进房间前需要判断房间有没有上锁,有就等,没有则可以进入。人进去后,把门上锁,外面的人只能等待里面的人出来。当出来时,可能是yield()临时暂停、join()谁调用谁就先执行,当前线程后执行、sleep()进入睡眠状态,于是唤醒了notify()一个,notifyAll()(唤醒一大堆,不知道谁会执行,看系统的时间片分配)其余的线程执行。
进入等待队列的线程,有些可能有较高的优先级,那它先执行的可能性就远远要大,就像有人有后台一样,有优势。但并不就是说优先级低的线程没有执行的机会。在系统时间片的轮转下、调度算法下,还是有点机会的。
java解决线程的同步的问题是用互斥锁的概念,即上面所述。用synchronized锁住对象,其余对象要等占有锁的对象执行完才能抢占资源。这又容易引起另一个问题,死锁。处于临界区的A想要同样处于临界区的B释放它所占有的资源,同时B又想要A的资源,双方互相处于等待的状态,就一直等咯。
二、因此又加了一个条件变量进行控制。A发现资源B处于忙碌状态,线程转为等待状态,等待释放资源并开锁,否则直接用,B转为忙碌状态。
三、在操作系统中,还有一个信号量机制实现线程同步。
1、当某一线程使用信号量机制来实现同一进程中各线程之间的同步时,线程创建私用信号量,属于特定进程所有,存放在应用程序的地址空间中。一旦发生私用信号量的占有者异常结束或正常结束但未释放私用信号量空间时,系统无法将它传送给下一个请求它的线程。
2、公用信号量,如名,公用,系统分配管理,未释放空间自动回收,系统通知下一个线程。
一、线程的同步,synchronized,简单地说,几个人要进入一间房间,房间里有临界资源,那些线程要访问的资源,整个房间就一 个临界区。人就是线程,在进房间前需要判断房间有没有上锁,有就等,没有则可以进入。人进去后,把门上锁,外面的人只能等待里面的人出来。当出来时,可能是yield()临时暂停、join()谁调用谁就先执行,当前线程后执行、sleep()进入睡眠状态,于是唤醒了notify()一个,notifyAll()(唤醒一大堆,不知道谁会执行,看系统的时间片分配)其余的线程执行。
进入等待队列的线程,有些可能有较高的优先级,那它先执行的可能性就远远要大,就像有人有后台一样,有优势。但并不就是说优先级低的线程没有执行的机会。在系统时间片的轮转下、调度算法下,还是有点机会的。
java解决线程的同步的问题是用互斥锁的概念,即上面所述。用synchronized锁住对象,其余对象要等占有锁的对象执行完才能抢占资源。这又容易引起另一个问题,死锁。处于临界区的A想要同样处于临界区的B释放它所占有的资源,同时B又想要A的资源,双方互相处于等待的状态,就一直等咯。
二、因此又加了一个条件变量进行控制。A发现资源B处于忙碌状态,线程转为等待状态,等待释放资源并开锁,否则直接用,B转为忙碌状态。
三、在操作系统中,还有一个信号量机制实现线程同步。
1、当某一线程使用信号量机制来实现同一进程中各线程之间的同步时,线程创建私用信号量,属于特定进程所有,存放在应用程序的地址空间中。一旦发生私用信号量的占有者异常结束或正常结束但未释放私用信号量空间时,系统无法将它传送给下一个请求它的线程。
2、公用信号量,如名,公用,系统分配管理,未释放空间自动回收,系统通知下一个线程。
相关文章推荐
- Clonezilla 再生龍
- 弹出框JBox实例
- ios开发 MPMoviePlayerController 视频播放器
- 从头到尾彻底解析哈希表算法【转】
- 链表带头节点与不带头节点的区别
- Cocos2d-x 重写draw方法绘制直线等图形时被遮挡覆盖问题的一种解决方案
- Eclipse(PHP、JAVA)的快捷键大全
- boost总结之variant
- python之列表使用方法总结
- 挑战庞果英雄会之子序列的个数
- 1014(2)string的用法
- 结构体定义里的冒号
- cstring转char*
- (贪心5.2.3)POJ 1065 Wooden Sticks(利用数据有序化来进行贪心选择)
- JavaScript 数组详解
- hdu1867 A + B for you again (KMP)
- Codeforces-346A
- hdu 1021-Fibonacci Again
- 记录,很好的用例子解释了什么是mapreduce
- 卦卦学mysql系列(1)——mysql入门 对数据库的操作