Как правильно доступатись к переменной из нескольких потоков?
Учусь работать с потоками, возникла проблема. Как вызывать метод из нескольких потоков понял. А как насчет переменных? Понял что надо использовать модификатор volatile, но надо ли код где используется переменная к которой могут доступиться из разных потоков, обертывать в synchronized()? Не могу найти информацию по этому вопросу.
Пример:
public class Main {
public static volatile String var = "1000";
public static class My implements Runnable {
Thread t;
My() {
t = new Thread(this);
t.start();
}
@Override
public void run() {
synchronized (var) {
//Какая то операция над переменной (изменение, чтение)
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws InterruptedException {
My my1 = new My();
My my2 = new My();
my1.t.join();
my2.t.join();
}
}
Или можно просто доступиться к переменной без данной обертки? То есть вот так:
@Override
public void run() {
//Какая то операция над переменной (изменение, чтение)
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Не возникнет ли ошибка когда два потока одновременно доступятся к данной переменной "var", и один попробует ее считать а другой ее изменить?
Буду благодарен за подробное объяснение.