在ruby中提供3个实现同步的方法,分别是:只负责同步的Mutex类中的方法,兼管数据交接的Queue方法,使用ConditionVariable类实现同步
@num=200
@mutex=Mutex.new
def ticketNum(num)
@mutex.lock
Thread.pass
if (@num>=num)
@num=@num-num
puts"您已经成功购买#{num}张火车票"
else
puts"对不起,您购买的#{num}张火车票失败,已经没有了"
end
@mutex.unlock
end
ticketsuccess=Thread.new(2){|num| ticketNum(num)}
ticketsuccess1=Thread.new(199){|num| ticketNum(num)}
ticketsuccess.join
ticketsuccess.join
运行结果
您已经成功购买199张火车票
对不起,您购买的2张火车票失败,已经没有了
还可以使用try_lock和synchronize来锁定线程,使用try_lock时,如果另一个资源已经锁定,则它返回false,使用synchronize如下:
@num=200
@mutex=Mutex.new
def ticketNum(num)
@mutex.synchronize do
Thread.pass
if (@num>=num)
@num=@num-num
puts"您已经成功购买#{num}张火车票"
else
puts"对不起,您购买的#{num}张火车票失败,已经没有了"
end
end
end
ticketsuccess=Thread.new(2){|num| ticketNum(num)}
ticketsuccess1=Thread.new(199){|num| ticketNum(num)}
ticketsuccess.join
ticketsuccess.join
执行结果与上面一样