powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / concurrency in practice почему SafePoint threadSafe?
11 сообщений из 11, страница 1 из 1
concurrency in practice почему SafePoint threadSafe?
    #39402540
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В concurrency in practice пишут, что это thread safe class:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@ThreadSafe
public class SafePoint { 
    @GuardedBy("this") private int x, y;
    private SafePoint(int[] a) { this(a[0], a[1]); }
    public SafePoint(SafePoint p) { this(p.get()); }
    public SafePoint(int x, int y) { 
        this.x = x;
        this.y = y;
    }
    public synchronized int[] get() { return new int[] { x, y };
    }
    public synchronized void set(int x, int y) { this.x = x;
        this.y = y;
    }
}



ещё есть сноска:

concurrency in practiceThe private constructor exists to avoid the race condition that would occur if the copy constructor were implemented as this(p.x, p.y); this is an example of the private constructor capture idiom (Bloch and Gafter, 2005).


Не понимаю почему класс thread-safe. Ведь после того как выставили значения x,y в конструкторе мы можем увидеть ссылку на объект в котором поля не полностью проинициализированы.


не понял я зачем нужно 3! конструктора и один из них приватный. Какая race condition тут?
...
Рейтинг: 0 / 0
concurrency in practice почему SafePoint threadSafe?
    #39402553
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это не thread safe будет в двух случаях:
1.простой конструктор safepoint(6, 6) и расшариваем без happens before
2. Copy конструктор new Safepoint(oldsafepoint) и расшариваем эту новую копию без happens before.
Другое дело, что бы в java расшарить объект без happens before нужно специально постараться (если использовать стандартные коллекции конкаррент то там HB везде). Если бы копи конструктор без p.get() был а просто p.x p.y, то здесь нет HB между synchronized setxy и чтением обычных полей x y. Кароче, с той точки зрения с которой здесь обсуждали синглтон это не safe.
...
Рейтинг: 0 / 0
concurrency in practice почему SafePoint threadSafe?
    #39402848
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892,

а зачем изобрели какое-то решение с приватным конструктором когда и так дырок хватает? он защищает от какой-то более очевидной проблемы?
...
Рейтинг: 0 / 0
concurrency in practice почему SafePoint threadSafe?
    #39402940
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непонятно зачем этот конструктор нужен. Мало того что в нем
нет тривиальных проверок или asserts на array bounds но и сама
мотивация использовать подобный код - сомнительна.

Код: java
1.
 private SafePoint(int[] a) { this(a[0], a[1]); }



Вобщем не ходите дети в африку гулять. Не пишите так.

Никогда не пишите.
...
Рейтинг: 0 / 0
concurrency in practice почему SafePoint threadSafe?
    #39403076
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonНепонятно зачем этот конструктор нужен. Мало того что в нем
нет тривиальных проверок или asserts на array bounds но и сама
мотивация использовать подобный код - сомнительна.

Код: java
1.
 private SafePoint(int[] a) { this(a[0], a[1]); }



Вобщем не ходите дети в африку гулять. Не пишите так.

Никогда не пишите.

понял таки зачем приватный конструктор:

входная информация, которую подаёт автор это то, что он хочет конструктор копирования такого типа:

Код: java
1.
public SafePoint(SafePoint p) { .... }




пока у нас есть только такой конструктор:

Код: java
1.
2.
3.
4.
 public SafePoint(int x, int y) { 
        this.x = x;
        this.y = y;
    }




и мы не хотим дублировать логику, и чтобы её не дублировать надо писать что-то типа:
Код: java
1.
2.
3.
4.
public SafePoint(SafePoint p) {
       int [] arr = p.get();
       this(arr[0], arr[1]);
}




Но так нельзя, ибо this/super должен быть первой строкой конструктора.


и чтобы решить эту проблему - делаем такой вот трюк:
private constructor capture idiom

Код: java
1.
2.
    private SafePoint(int[] a) { this(a[0], a[1]); }
    public SafePoint(SafePoint p) { this(p.get()); }



а то почему здесь race condition нет это потому, что мы единожды забрали массив, а не два раза обращаемся к разным массивам.

Но всё равно как-то неочевидно написано и опять же thread-safe почему он это называет - непонятно
...
Рейтинг: 0 / 0
concurrency in practice почему SafePoint threadSafe?
    #39403134
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора то почему здесь race condition нет это потому, что мы единожды забрали массив, а не два раза обращаемся к разным массивам.

Но всё равно как-то неочевидно написано и опять же thread-safe почему он это называет - непонятно
Data race нет, т.к. есть hb между set/get, а не то, что массив "единожды забираем". А почему Threadsafe назвали - имхо, потому, что предполагается, что читатель будет объекты расшаривать через hb.
...
Рейтинг: 0 / 0
concurrency in practice почему SafePoint threadSafe?
    #39403221
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892,

а зачем тогда вообще вся эта история с массивом?
...
Рейтинг: 0 / 0
concurrency in practice почему SafePoint threadSafe?
    #39403250
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Data race нет, т.к. есть hb между set/get,
А где в приведенном коде вызов этого set? Даже public SafePoint(int x, int y) сделано без оного.

Публикация безопасна, если get будет иметь hb к конструктору.
...
Рейтинг: 0 / 0
concurrency in practice почему SafePoint threadSafe?
    #39403256
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerа зачем тогда вообще вся эта история с массивом?
Это консистентное копирование. Суть в нем.
Если бы было this.x=p.x; this.y=p.y; То, возможно, x и y достались бы от разных точек.
Поэтому забираются только парой - через get.

Собственно это логичное обоснование для x и y быть приватными с доступом, через сеттер/геттер.
...
Рейтинг: 0 / 0
concurrency in practice почему SafePoint threadSafe?
    #39403761
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевno56892Data race нет, т.к. есть hb между set/get,
А где в приведенном коде вызов этого set? Даже public SafePoint(int x, int y) сделано без оного.
Публикация безопасна, если get будет иметь hb к конструктору.

Ну вот так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
volatile SafePoint shared;

//Thread1:
shared = new SafePoint(10, 10);
SafePoint local = new SafePoint(shared); // без p.get() здесь нет hb с (2)

//Thread2:
shared.set(20, 20); //2
...
Рейтинг: 0 / 0
concurrency in practice почему SafePoint threadSafe?
    #39403996
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Ну вот так
Да мы про одно и то же, но разными словами про атомарность операций чтения-записи пары координат.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / concurrency in practice почему SafePoint threadSafe?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]