Používam mutex v rubínovom kóde v mnohých súboroch. aby som sa zaoberal tým, že som vytvoril triedu singleton s jedným mutexovým objektom, ktorý používam po celú dobu:
class LockBlock
include Singleton
def initialize
@lock = Mutex.new
end
def lock
@lock
end
end
Mám dve otázky:
- Je to najlepší spôsob, ako deklarovať svoj mutex objekt? Mám použiť modul namiesto Singleton? Používam ho v mnohých súboroch ..
- Ak ju používam takto, zakaždým, keď uzamknem blok, musím napísať:
LockBlock.instance.lock.synchronize {
# code here..
}
Existuje skratka pre toto? možno vyhlásiť funkciu uzamknutia, takže budem schopný napísať niečo takéto:
LockBlock.lock {
# code here..
}
Vďaka
odpovede:
0 pre odpoveď č. 1LockBlock
je samotný objekt, ktorý možno použiť na ukladanie @lock
a je to jediný v celej aplikácii.
Môžete ho použiť pre globálny singleton zámok:
class LockBlock
@lock = Mutex.new
class << self
Mutex.instance_methods(false).each do |method|
define_method(method) do |&block|
@lock.send(method, &block)
end
end
end
end
# Now LockBlock is a Mutex like singleton object
# and you can use it anywhere in your application (load when necessary)
LockBlock.lock
begin
puts LockBlock.owned?
ensure
LockBlock.unlock
end
LockBlock.synchronize { puts LockBlock.owned? }
IMO model singleton sa v jazyku Java používa skôr ako statický jazyk OO, nie je užitočný v dynamickom jazyku.