Синхронизация в векторах в Java

то, что предназначено вектором в Java, ориентировано на многопотоковое исполнение и синхронизируется, как это, сделал ориентированным на многопотоковое исполнение. Я смотрю на внутренние детали реализации

9
задан emkrish 27 January 2010 в 05:57
поделиться

3 ответа

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

Тем не менее, вы правы, что клиенты класса могут понадобиться осознавать, что конструктор может заблокировать или сбой. По этой причине я мог бы сделать конструктор частным и использовать статический фабричный метод (названный конструктор IDIOM), чтобы клиенты должны сделать явную MakeConnection .

Это все еще обязанность клиента, чтобы определить, не имеет к нему соединение, или может ли он справиться с автономным режимом. В прежнем случае он может владеть соединением по значению и пусть любая неспособность подключения к своим клиентам; В последнем он может владеть объектом через указатель, предпочтительно «умный». В последнем случае он может попытаться построить построение собственного соединения в его конструкторе, или она может отложить его до необходимости.

E.G. (Предупреждение: код всех совершенно непроверенных)

class Connection
{
    Connection(); // Actually make the connection, may throw
    // ...

public:
    static Connection MakeConnection() { return Connection(); }

    // ...
};

Вот класс, который требует рабочего соединения.

class MustHaveConnection
{
public:
    // You can't create a MustHaveConnection if `MakeConnection` fails
    MustHaveConnection()
        : _connection(Connection::MakeConnection())
    {
    }

private:
    Connection _connection;
};

Вот класс, который может работать без одного.

class OptionalConnection
{
public:
    // You can create a OptionalConnectionif `MakeConnection` fails
    // 'offline' mode can be determined by whether _connection is NULL
    OptionalConnection()
    {
        try
        {
            _connection.reset(new Connection(Connection::MakeConnection()));
        }
        catch (const std::exception&)
        {
            // Failure *is* an option, it would be better to capture a more
            // specific exception if possible.
        }
    }

    OptionalConnection(const OptionalConnection&);
    OptionalConnection& operator=(const OptionalConnection&);

private:
    std::auto_ptr<Connection> _connection;
}

И, наконец, тот, который создает один по требованию и проторит исключения для абонента.

class OnDemandConnection
{
public:
    OnDemandConnection()
    {
    }

    OnDemandConnection(const OnDemandConnection&);
    OnDemandConnection& operator=(const OnDemandConnection&);

    // Propgates exceptions to caller
    void UseConnection()
    {
        if (_connection.get() == NULL)
            _connection.reset(new Connection(Connection::MakeConnection()));

        // do something with _connection
    }

private:
    std::auto_ptr<Connection> _connection;
}
-121--3147307-

Методы помечены как синхронизированы . Проверьте синхронизированный учебник метода .

0
ответ дан 4 December 2019 в 09:36
поделиться

Вектор считается «безопасным потоком», поскольку доступ к внутреннему вектору синхронизирован. Методы, такие как , Add () , GET () , Размер () , и т. Д., Все синхронизированы такими, как модификации внутренней структуры Вектор и доступ к этой внутренней структуре не может быть обработан одновременно отдельными потоками.

-121--3266152-

Сделано «Безопасен в потоке» за заслуги всех его методов, которые синхронизированы (через синхронизированное ключевое слово), см. Исходный код .

Что делает синхронизированное ключевое слово, заключается в том, что он предотвращает более одного потока выполнения любых из синхронизированных методов одновременно. Он использует блокировку внутри, что нить должна получить при входе из этих методов, и что потоковые выпускают, когда он покидает метод.

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

Рассмотрим этот пример, который показывает, что вам все еще нужно использовать синхронизацию в вашем приложении (чтобы вы могли бы просто использовать несинхронизированную арарилист):

 // BROKEN CODE, needs external synchronization
 // only add an element if the vector is empty
 if(vector.isEmpty())
     vector.add(anElement);
18
ответ дан 4 December 2019 в 09:36
поделиться

Vector считается "потокобезопасным", т.к. доступ к внутренним компонентам Вектора синхронизирован. Такие методы, как add(), get(), size() и т.д. синхронизированы таким образом, что изменения внутренней структуры Vector и доступ к этой внутренней структуре не могут быть одновременно обработаны отдельными потоками.

4
ответ дан 4 December 2019 в 09:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: