Атомарные гарантии, что доступ к свойству будет выполнен атомарным способом. Например, это всегда возвращает полностью инициализированные объекты, любой получает/устанавливает свойства на одном потоке, должен завершиться, прежде чем другой может получить доступ к нему.
, Если бы Вы воображаете следующую функцию, происходящую на двух потоках сразу, Вы видите, почему результаты не были бы симпатичны.
-(void) setName:(NSString*)string
{
if (name)
{
[name release];
// what happens if the second thread jumps in now !?
// name may be deleted, but our 'name' variable is still set!
name = nil;
}
...
}
Профессионалы: Возврат полностью инициализированных объектов каждый раз делает его лучше всего выбором в случае многопоточности.
Недостатки: хит Производительности, делает выполнение немного медленнее
В отличие от Атомарного, это не гарантирует, чтобы полностью инициализированный объект возвратился каждый раз.
Профессионалы: Чрезвычайно быстрое выполнение.
Недостатки: Возможности мусора оценивают в случае многопоточности.
ДАННЫЕ такие же. Вы получите тот же результат, если вместо выполнения Foo.new выполните DATA.read второй раз.
Это потому, что после первого чтения DATA
(который является вводом-выводом) достиг конца потока, поэтому любое дальнейшее чтение будет возвращать пустую строку, если вы не добавите дополнительные данные в DATA или не перемотаете DATA
в начало потока.
Изменить: для возврата к точке сразу после __ END __
вы должны прочитать DATA.pos
перед выполнением любого чтения DATA
, а затем восстановить pos
до этого значения после чтения. Самое простое решение, вероятно, просто выполнить FOO = DATA.read
в начале сценария, а затем использовать FOO
.
сначала перемотайте ДАННЫЕ, потому что это поток.
class Foo
def initialize()
DATA.rewind
puts DATA.read.inspect
end
end
puts DATA.read.inspect
Foo.new
__END__
test