powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / коллеги, это потокобезопасно?
11 сообщений из 11, страница 1 из 1
коллеги, это потокобезопасно?
    #39709452
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
коллеги, подскажите, такой класс потокобезопасен?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class ExportProgress {

    private final long total;
    private final AtomicLong done = new AtomicLong(0);

    public ExportProgress(long total) {
        this.total = total;
    }

    public void setDone(long done) {
        this.done.set(done);
    }

    public void incrementDone() {
        this.done.incrementAndGet();
    }

    public int getPercentageDone() {
        return total == 0 ? 0 : (int) Math.min(done.get() * 100 / total, 100);
    }

}
...
Рейтинг: 0 / 0
коллеги, это потокобезопасно?
    #39709466
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiter,
Что в вашем понимании потокобезопасно? Следует отличать потокобезопасность, гарантию видимости изменений и корректность.
В вашем случае конструктор потокобезопасный, это +. Далее два метода мутирующих сосстояние, setDone и incrementDone, оба изменяют значение одного и того же атомик счетчика - значит проблем с видимостью изменений тоже не будет, опять +.
Далее сложнее, доказать корректность - тут нужен контекст, если побыть телепатом, то скорее всего у вас ошибки. Зачем два метода изменения? Причем один инкрементит а второй все затирает и ставит новое значение? Допустим два потока инкрементят себе, инкрементят, а потом приходит лесник и выставляет setDone(0)... wtf?

Назначение переменной total тоже туманное.

Если резюмировать, то код выглядит "потокобезопасным" в разрезе именно конкурентного доступа к данным и видимостью, но я почти уверен что это работает не так как вы ожидаете
...
Рейтинг: 0 / 0
коллеги, это потокобезопасно?
    #39709471
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

да, все верно,туманно! но вы ответили на мой вопрос, спасибо!

а вообще контекст такой, что один поток будет только читать, а второй поток - обновлять значения. По поводу лесника - да, но в реальности такого не будет.
...
Рейтинг: 0 / 0
коллеги, это потокобезопасно?
    #39709472
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
много читал про потокобезопасность и не мало уже знаю, но практики маловато именно в этом топике, так что каждый раз, когда приходится что - нибудь подобное писать, сомневаюсь и 100 раз перепроверяю)
...
Рейтинг: 0 / 0
коллеги, это потокобезопасно?
    #39709474
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
изначально переменная done вообще была просто long volatile, но потребовалась функция инкремента и я подумал вместо блокировки попробовать атомик
...
Рейтинг: 0 / 0
коллеги, это потокобезопасно?
    #39709494
cossack5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод getPercentageDone непотокобезопасен, т.к. у вас там есть и чтение и запись, и может получиться ArithmeticException. Можно сделать так:
Код: java
1.
2.
3.
4.
    public int getPercentageDone() {
        int tempTotal=total;
        return tempTotal == 0 ? 0 : (int) Math.min(done.get() * 100 / tempTotal, 100);
    }
...
Рейтинг: 0 / 0
коллеги, это потокобезопасно?
    #39709511
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cossack5,

да не, вроде не должно, поле total же не меняется, оно финальное
...
Рейтинг: 0 / 0
коллеги, это потокобезопасно?
    #39709525
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rabiter
Код: sql
1.
2.
3.
    public int getPercentageDone() {
        return total == 0 ? 0 : (int) Math.min(done.get() * 100 / total, 100);
    }



Потокобезопасно и некорректно. Что за фигню он будет выдавать после 100%.
Ты воздействуешь событиями на ExportProgress а он не оказывает влияния на результат.
...
Рейтинг: 0 / 0
коллеги, это потокобезопасно?
    #39709531
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

после 100 он будет выдавать 100! это лучше чем если мы увидим 150%. может конечно бросать исключение при попытке перевыполнить план, но я уверяю вас, в моец ситуации это абсолютно излишне.
но спасибо за заботу :-)
...
Рейтинг: 0 / 0
коллеги, это потокобезопасно?
    #39709532
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А минус сто пятьдесят? Вобщем... странный дизайн.
...
Рейтинг: 0 / 0
коллеги, это потокобезопасно?
    #39709534
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

а да, при переполнении можно и в минус уйти запросто
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / коллеги, это потокобезопасно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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