В Java я должен объявить свой набор, синхронизируемый, если это только для чтения?

Вы смешиваете заявления с подготовленными заявлениями. Вы должны использовать подготовленный оператор и установить его значения:

public void addCustomer(String name, String surname, String company, String address, String adressTwo) {
    String addQuery = "insert into musteri (name, surname, company, adress, adressTwo) values (?,?,?,?,?)" ;

    // Shown here for simplicitly.
    // The query could be prepared once and stored in a data member
    try (PreparedStatement ps = con.prepareStatement(addQuery)) {
        ps.setString(1, name);
        ps.setString(2, surname);
        ps.setString(3, company);
        ps.setString(4, address);
        ps.setString(5, addressTwo);
        ps.executeUpdate();
        System.out.println("Data Added");
    } catch (Exception e) {
        System.out.println("Error occured when adding value to database : " + e );
    }
}
19
задан Alex Miller 30 September 2008 в 13:45
поделиться

5 ответов

Обычно не, потому что Вы не изменяете внутреннее состояние набора в этом случае. Когда Вы выполняете итерации по набору, новый экземпляр итератора создается, и состояние повторения на экземпляр итератора.

<час>

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

class Test {
    public Test(final int a, final int b) {
        this.a = a;
        this.b = b;
    }

    public int a;
    public int b;
}

public class Main {

    public static void main(String[] args) throws Exception {
        List<Test> values = new ArrayList<Test>(2);
        values.add(new Test(1, 2));
        values.add(new Test(3, 4));

        List<Test> readOnly = Collections.unmodifiableList(values);
        for (Test t : readOnly) {
            t.a = 5;
        }

        for (Test t : values) {
            System.out.println(t.a);
        }
    }

}

Это производит:

5
5
<час>

Важные факторы от @WMR answser.

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

причиной этого является Модель памяти Java, если Вы хотите знать более чтение раздел "Visibility" в этой ссылке: http://gee.cs.oswego.edu/dl/cpj/jmm.html

И даже если потоки запускаются после заполнения набора Вам, возможно, придется синхронизироваться, потому что Ваша реализация набора могла изменить свое внутреннее состояние даже на операциях чтения (спасибо Michael Bar-Sinai , я не знал, что такие наборы существовали).

Другим очень интересным чтением по теме параллелизма, который затрагивает темы как публикация объектов, видимости, и т.д. в намного большем количестве деталей является книжный Параллелизм Java Brian Goetz на практике .

19
ответ дан 30 November 2019 в 03:16
поделиться

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

причиной этого является Модель памяти Java, если Вы хотите знать более чтение раздел "Visibility" в этой ссылке: http://gee.cs.oswego.edu/dl/cpj/jmm.html

И даже если потоки запускаются после заполнения набора Вам, возможно, придется синхронизироваться, потому что Ваша реализация набора могла изменить свое внутреннее состояние даже на операциях чтения (спасибо Michael Bar-Sinai , я не знал, что такие наборы существовали в стандартном JDK).

Другим очень интересным чтением по теме параллелизма, который затрагивает темы как публикация объектов, видимости, и т.д. в намного большем количестве деталей является книжный Параллелизм Java Brian Goetz на практике .

10
ответ дан 30 November 2019 в 03:16
поделиться

В общем случае Вы должны. Это вызвано тем, что некоторые наборы изменяют свою внутреннюю структуру во время чтений. LinkedHashMap, который использует порядок доступа, является хорошим примером. Но не делайте просто честное слово:

В заказанных доступу связанных картах хеша, просто запрашивая карту с добираются, структурная модификация Связанный javadoc

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

9
ответ дан 30 November 2019 в 03:16
поделиться

Вы не имеете к, как объяснено в других ответах. Если Вы хотите удостовериться, что Ваш набор только для чтения, можно использовать:

yourCollection = Collections.unmodifableCollection(yourCollection);

(похожий метод существуют для Списка, Набора, Карты и других типов набора)

3
ответ дан 30 November 2019 в 03:16
поделиться

Сам набор не делает, но имеет в виду, что, если то, что он содержит, не неизменно также, тем отдельным классам нужна их собственная синхронизация.

0
ответ дан 30 November 2019 в 03:16
поделиться
Другие вопросы по тегам:

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