powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Легкие вопросы по volatile и synchronized
4 сообщений из 4, страница 1 из 1
Легкие вопросы по volatile и synchronized
    #39424427
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер! Никогда не приходилось много работать с многопоточностью, но решил немного освежить знания и разложить все по полочкам. Интересует мнение знающих людей по этому простому примеру. Тут три простецких класса, которые претендует на то, чтобы быть thread-safe. Предполагается что инстанс каждого класса расшарен между разными потоками. Посмотрите мои комментарии, я нигде не ошибаюсь?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class ClassA {
  private int num;
  /**
   * несмотря на то, что присвоение int атомарно, геттер все равно должен быть в блоке synchronized 
   * это нужно для того, чтобы поток увидел изменения, сделанные другим потоком по отношению к переменной num
   */
  public synchronized int get() {
    return num;
  }
  public synchronized void set(int value) {
    num = value;
  }
}



Если примитив int мы пометим volatile, то мы можем избавиться от synchronized (volatile означает, что переменная сохраняется не в кэше потока, а в мастер копии, соответственно все потоки будут видеть изменения)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class ClassB {
  private volatile int num;
  public int get() {
    return num;
  }
  public void set(int value) {
    num = value;
  }
}



А вот тут я сомневаюсь, если мы int заменим на String, операция присвоения ссылки атомарна, так что следующий класс тоже получается потокобезопасным?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class ClassC {
  private volatile String name;
  public String get() {
    return name;
  }
  public void set(String value) {
    name = value;
  }
}



А если мы атомарную операцию присваивания заменим инкрементом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class ClassD {
  private volatile int num;
  /**
   * Здесь не нужен synchronized потому что мы volatile? Или нужен, я не понимаю.
   */
  public int get() {
    return num;
  }
  public synchronized void increment() { // здесь нужен synchronized, чтобы два потока не начали инкрементацию
    num++;
  }
}
...
Рейтинг: 0 / 0
Легкие вопросы по volatile и synchronized
    #39425206
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, все куски кода потокобезопасные. Когда volatile используется в synchronized, то второй как мьютекс обычно.
...
Рейтинг: 0 / 0
Легкие вопросы по volatile и synchronized
    #39425219
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во всех случаях, кроме последнего достаточно только volatile, в последнем, где инкремент то меняем int -> AtomicInteger и используем инкремент из него, использование synchronized в приведенных случаях избыточно.
...
Рейтинг: 0 / 0
Легкие вопросы по volatile и synchronized
    #39425310
rabiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, спасибо!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Легкие вопросы по volatile и synchronized
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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