A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李成航 中级黑马   /  2012-3-19 13:03  /  2146 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们知道一个semaphore可以通过初始化指定的信号数来限制线程对资源的访问。只有拥有信号的线程才能访问资源。当线程访问完资源后会释放信号并归还资源 。比如厕所有5个坑的例子,用完厕所它会归还坑这个资源。
我想问的是semaphore适不适合用在线程访问完资源后只释放信号而不归还资源的情形?比如桌上有20个苹果资源,只初始化信号数为3,即同一时刻最多允许3个线程访问资源,并且每个线程拿去后释放信号然后吃掉而不归还苹果,就像这种情形?

2 个回复

倒序浏览
你是不是这个意思?你new Thread()多弄几次然后不对他操作也就是占着Thread-0 ...Thread-n这样是可以的 但是浪费资源 差不多是这个意思
回复 使用道具 举报
可以,这取决于释放信号之前做了哪些操作:如果一个箱子里放了20个苹果,同时只能有三个人一人访问一个苹果,就从箱子里拿出三个苹果放在1,2,3三个位置上供人访问.如果访问的人离开之前把他访问到的苹果放回了原位,那么下一个人访问到的还是原来的苹果,等于是即释放信号也释放资源.
如果每个访问的人离开之前都箱子里取出一个苹果替换掉他访问的苹果,那么下一个获得访问资格的人访问的就是一个新的苹果,直到箱子里没有苹果时停止访问.这就相当于释放信号不释放资源.可以把剩下的17个苹果放在List集合中,每个线程在释放信号之前都调用集合的remove(0)方法,把返回来的苹果替换掉原来的苹果,直到remove(0)返回null为止.

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马