Как синхронизировать доступ к полям класса Java?

Здравствуйте.

Имеется переменная в классе, которая активно используется несколькими потоками. Например:
public class A {
 private int magicVar;
 
 private void someMethod() {
   // операции с magicVar
 }

 public synchronized void somePublicMethod() {
   // операции с magicVar
 } 

 private class B extends Thread {
 
  @Override
  private void run() {
    // операции с magicVar
  }

 }
}

Как в данном случае правильно организовать доступ к переменной? Описать приватные синхронизированные set и get? Или пометить поле как violate?
  • Вопрос задан
  • 3880 просмотров
Пригласить эксперта
Ответы на вопрос 3
@tsegorah
volatile означает, что переменная не кэшируется в "памяти потока", а всегда используется "основное значение", с данном случае это схоже с тем, что переменная синхронизированна собой же.

С учетом того, что это не просто переменная, а поле к классе, которое может быть много где использовано,
то у вас может получиться так, например, что один поток вызовет somePublicMethod, а второй поток захочет изменить переменную где то в середины выполнения метода.
Рекомендую вам сделать синхронизацию методов доступа к полю по инстансу объекта. (тот же synchronized на метод)
Ответ написан
Комментировать
@logder
Во-первых, volatile это не просто "не кешируется в памяти потока".
docs.oracle.com/javase/tutorial/essential/concurre...
Using volatile variables reduces the risk of memory consistency errors, because any write to a volatile variable establishes a happens-before relationship with subsequent reads of that same variable. This means that changes to a volatile variable are always visible to other threads. What's more, it also means that when a thread reads a volatile variable, it sees not just the latest change to the volatile, but also the side effects of the code that led up the change.


Во-вторых, как организовать работу с magicVar зависит от конкретных операций, которые будут с нею выполняться.
Ответ написан
Комментировать
njc
@njc
Разработчик Java
Сделайте synchronized для методов set и get, очень вероятно, что Вам этого хватит. По мере дальнейшей разработки Вы погрузитесь в concurrency глубже и начнете понимать и продумывать заранее многие вещи.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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