Статические методы в GOSU и Thread-Safety

У меня есть ниже функция в классе.gs, который вызывается при доступе к конкретной информации о претензиях -

public static function testVisibility(claim : Claim) : boolean {
    if(claim.State == ClaimState.TC_OPEN){
        return true;
    }
    else{
        return false;
    }
}

Мой вопрос -

a) Если два пользователя обращаются к информации о своих соответствующих претензиях, эта функция должна вызываться дважды - в первый раз она должна получить экземпляр заявки первого пользователя, а вторая - экземпляр заявки второго пользователя. Если одновременный доступ - будут ли вызваны две копии одной и той же функции? Не должно быть так, так как статическая функция имеет только одну копию. Итак, если это одна копия, как обеспечивается безопасность потоков? Будет ли функция вызываться одна за другой?

б) Как и в Java, Gosu также использует Heap для запуска статических функций?

3 ответа

Кажется, вы немного запутались в определении здесь. Потокобезопасный - это всего лишь механизм, созданный для защиты целостности данных, разделяемых между потоками. Поэтому ваш пример функции является поточно-ориентированным, независимо от того, статичен он или нет.

а) По вышеупомянутой причине здесь не возникнет проблем с безопасностью потоков, поскольку вы работаете с двумя различными наборами данных.

б) При условии, что Gosu создан для работы на JVM и создания файлов.class, я считаю, что по большей части (если не на 100%, помимо синтаксиса) он будет вести себя как Java.

Это путаница клише, когда мы начинаем любить любой язык программирования.

Рассмотрим 100 человек, которые обращаются к веб-приложению ровно в определенный момент времени. Здесь, по вашему сомнению, статическая переменная / функция будет возвращать / совместно использовать значение контента для всех 100 человек. Дело в том, что обмена данными здесь не будет, потому что для каждого соединения с сервером создается каждый отдельный THREAD, и все приложение работает в этом потоке (называемом "один поток на соединение").

Поэтому, если у вас есть статическая / глобальная переменная, эта конкретная переменная будет работать на 100 различных потоках, а содержимое / данные каждого потока будут защищены и недоступны из других потоков (напрямую). Вот как работают веб-приложения.

Если нам нужно разделить некоторые переменные / классы между потоками, мы должны сделать это синглтоном. Например, для соединений с базой данных нам не нужно создавать соединение все время, если уже существует установленное соединение. В этом случае класс соединения будет одноэлементным.

Надеюсь, что это имеет смысл.:)

-Aravind

просто вернись

      public static function testVisibility(claim : Claim) : boolean {
  return claim.State == ClaimState.TC_OPEN   
}

и использоватьisVisibleкак имя функции

Другие вопросы по тегам