Цель C эквивалент интерна () в Java - PullRequest
2 голосов
/ 08 сентября 2011

Мне нужно реализовать некоторые алгоритмы синхронизации в зависимости от строк.Я имею в виду, что два потока должны быть синхронизированы, и пара потоков зависит от строкового значения (одна пара потоков для строки A, одна пара для строки B и т. Д.).

В Java я мог быреализовать алгоритм с использованием метода intern для получения единого объекта блокировки, который используется обоими потоками.Java тянет все литералы во встроенный пул jvm, а интернет позволяет преобразовать любую динамически созданную строку в литерал в пуле.

Я понял, что в Objective C * 1006 также есть механизм объединения*.

Но есть ли какой-либо эквивалент intern () в Java, т. Е. Способ преобразования нормальной строки в литеральную строку из пула констант String.Чтобы получить ссылку на этот уникальный String litteral, чтобы оба моих потока могли синхронизироваться на одном и том же объекте.

Я знаю, что есть некоторые обходные пути, но все они подразумевают множество сравнений String, которых я бы хотел избежать,(Хотя я считаю, что стажер делает это, но оптимизированным способом ...)

Чтобы объяснить мою проблему в более общем виде: я хочу избежать словаря, который отображает строку в блокировку.Java позволяет мне делать это благодаря интерну, так как литеральная строка (объединенная) станет замком.Есть ли эквивалент или я должен использовать эту карту.

Спасибо, Стефан

Ответы [ 4 ]

2 голосов
/ 08 сентября 2011

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

NSString *stringA = [NSString stringWithString:@"Hello"];
NSString *stringB = [NSString stringWithFormat:@"%@l%@",@"Hel",@"o"];
NSString *stringC = [NSString stringWithFormat:@"Hell%@", @"o"];

NSLog(@"%p / %p / %p", stringA, stringB, stringC);

NSNumber *lockA = [NSNumber numberWithUnsignedInteger:stringA.hash];
NSNumber *lockB = [NSNumber numberWithUnsignedInteger:stringB.hash];
NSNumber *lockC = [NSNumber numberWithUnsignedInteger:stringC.hash];

NSLog(@"%p / %p / %p", lockA, lockB, lockC);

Вы заметите, что, хотя строки имеютразные адреса, их соответствующие номера NSN нет.Это связано с тем, что номера NSN для данного числа являются одиночными.

Теперь вы можете использовать @synchronize() для этих "блокирующих" объектов.

- Правка -

Фактто, что номера NSN являются единичными для заданного значения, является внутренней деталью реализации, что является одной из причин, по которым может быть хорошей идеей поиск реального механизма блокировки, такого как словарь, индексированный, например, NSString.

2 голосов
/ 08 сентября 2011

Я думаю, что сопоставление строк с блокировками, которые они представляют, - ваша лучшая ставка.

Вы не хотите блокировать саму строку (или интернированную версию), потому что это общий объект в JVM.Вы не знаете, что другой компонент в JVM делает то же самое, что может привести к тупику.

Параллелизм Java на практике описывает это лучше, но я не могу найтиссылка на данный момент.

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

2 голосов
/ 08 сентября 2011

Я наконец-то использовал словарь, который связывает каждую строку с условной блокировкой.

Спасибо всем

2 голосов
/ 08 сентября 2011

Я регулярно программирую на Java и Objective-C.

Во-первых, то, что вы описываете, кажется далеко не идеальным способом разделения блокировки. Это сложно, это хрупко, и это может запутать других программистов, не настолько близких к тому, как работает интернирование String. Почему бы просто не заблокировать объект блокировки в одном классе как другой константе?

public class Foobar {

    public static final Object LOCK = new Object();

    public void doLockedStuff() {
        synchronized (LOCK) {
            // code here
        }
    }

}

public class Barfoo {
    public void doLockedStuff() {
        synchronized (Foobar.LOCK) {
            // code here
        }
    }
}

И затем вы можете применить аналогичный подход в Objective-C - метод класса, представляющий общий объект LOCK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...