返回信息流互斥信号量做到线程同步,信号量会不会被同时修改呢?比如A读S=1,占有资源,减去1;而在同时B也读到1,也误认为没有被占用,修改信号量,也减去1。问一下会出现这种情况吗?
这是一条镜像帖。来源:北邮人论坛 / java / #57400同步于 2017/9/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
问一个比较低级的问题?????????
XZC
2017/9/6镜像同步20 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
举个例子,例如线程A,线程B在同一时刻发现资源数量为1,于是线程A和线程B都尝试将资源数量改为0。这个写操作的原子性可以用CAS来保证(原值为1,期望值为0),线程A和B只有一个能够成功,另一个将失败
但如果理解为锁(写锁,独占锁)的话,锁仅仅会串行化并发操作,也就是线程A和线程B最终都修改成功了,这个感觉就出问题了,原因在于忽略了原值为1这个条件。
所以我感觉这么理解会有点问题?我只是瞎逼逼[ema0]。
【 在 kaka2634 的大作中提到: 】
: 那信号量可不可以理解为读写锁呢
:
: 发自「贵邮」
六爷逼逼的可以
【 在 liuyehcf 的大作中提到: 】
: 举个例子,例如线程A,线程B在同一时刻发现资源数量为1,于是线程A和线程B都尝试将资源数量改为0。这个写操作的原子性可以用CAS来保证(原值为1,期望值为0),线程A和B只有一个能够成功,另一个将失败
: .........
发自「贵邮」
很详细,谢谢!延伸一下,如何用java编程来实现这种原子操作呢?
【 在 nuanyangyang 的大作中提到: 】
: 信号量可以用来实现锁。它比锁的层次低。
: 原子内存读改写操作是cpu的特殊指令保证读改写整体原子的。
高层的话java提供了Semaphore,也有Lock以及ReentrantLock。低级的也有AtomicInteger类,有CompareAndSet方法。