Value Change Sensitivity

How do I do something like this :

i = 0 a = Thread.new {   i.valueChange { | val | puts "i is now #{val} } } b = Thread.new {    i = 2 # => "i is now 2" } a.join b.join

The idea is everytime the value of i changes, the block associated with i gets executed