Объект, переданный в директиву
blockquote>@synchronized
, является уникальным идентификатором, используемым для выделения защищенного блока. Если вы выполняете предыдущий метод в двух разных потоках, передавая другой объект для параметраanObj
в каждом потоке, каждый из них будет блокировать его и продолжить обработку, не будучи заблокированным другим. Однако, если вы передаете один и тот же объект в обоих случаях, один из потоков сначала получит блокировку, а другой будет блокироваться до тех пор, пока первый поток не завершит критический раздел.Так что это зависит от то, что вы хотите защитить от выполнения одновременно, и есть приложения для всех трех случаев.
Например, в
-(void)addToMyArray1:(id)obj { @synchronized(self) { [self.myArray1 addObject:obj]; } } -(void)addToMyArray2:(id)obj { @synchronized(self) { [self.myArray2 addObject:obj]; } }
оба блока
@synchronized
не могут быть выполнены одновременно два потока, вызывающие метод на одном и том же экземпляре (self
), тем самым защищая одновременный доступ к массивам из разных потоков.Но он также блокирует блок от первого метода которые будут выполняться одновременно с блоком из второго метода, потому что они используют один и тот же замок
self
. Поэтому для более мелкозернистой блокировки вы можете использовать разные блокировки:-(void)addToMyArray1:(id)obj { @synchronized(self.myArray1) { [self.myArray1 addObject:obj]; } } -(void)addToMyArray2:(id)obj { @synchronized(self.myArray2) { [self.myArray2 addObject:obj]; } }
Теперь одновременный доступ к
self.myArray1
иself.myArray2
из разных потоков по-прежнему защищен, но независимо друг от друга.Блокировка класса может использоваться для защиты доступа к глобальной переменной. Это просто тривиальный пример демонстрационных целей:
static int numberOfInstances = 0; -(id)init { self = [super init]; if (self) { @synchronized([self class]) { numberOfInstances++; } } }
Похоже, вы пытаетесь решить проблему, которая пытается научить вас дескрипторам. Посмотрите https://docs.python.org/3.7/howto/descriptor.html для получения более подробной информации.
Но все, что нужно для задачи, для которой вы пишете решение:
class Celsius:
def __get__(self, obj, objtype):
return ((obj.fahrenheit - 32) * 5) / 9
def __set__(self, obj, celcius):
obj.fahrenheit = ((celcius * 9) / 5) + 32
class Temperature:
celcius = Celsius()
def __init__(self, fahrenheit=0):
self.fahrenheit = fahrenheit
Обратите внимание на несколько важных различий с вашим кодом:
Celcius
создан и непосредственно назначается celcius
в классе, а не атрибуту в экземпляре Temperature, как в вашем случае. Temperature
.