Я делаю Runnable, который будет выполнять некоторую независимую работу, но за его прогрессом будет следить другой поток.
Для этого я поместил приватное строковое поле, содержащее «состояние» моего потока. Поток обновит свой процесс, используя метод установки этого поля, а другой поток получит состояние, используя метод получения. На данный момент я написал следующий код и использую блокировку для синхронизации моего геттера и сеттера. Но мне интересно, нужно ли это.
Я предполагаю, что мой вопрос можно было бы резюмировать следующим образом: «Является ли аффектация атомарной в Java»
Заранее спасибо, если вы нашли время, чтобы прочитать мой вопрос.
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class FollowedThread implements Runnable {
private String state;
private final Lock lock;
public FollowedThread() {
lock = new ReentrantLock();
}
public void setState(String state) {
lock.lock();
try {
this.state = state;
} finally {
lock.unlock();
}
}
public String getState() {
String result;
lock.lock();
try {
result = state;
} finally {
lock.unlock();
}
return result;
}
@Override
public void run() {
setState("Step 1 running");
try {
Thread.sleep(1000);
setState("Step 2 running");
Thread.sleep(2000);
setState("Step 3 running");
Thread.sleep(3000);
setState("Thread finished");
} catch (InterruptedException e) {
setState("Thread interrupted");
}
}
}
Lock
, когда можно просто сделатьsynchronized(state)
? - person NiziL   schedule 11.03.2015volatile
, никакой другой синхронизации не требуется. Ссылки на объекты назначаются атомарно. - person Alex Salauyou   schedule 11.03.2015