나는 이런 식으로 어느 정도 서버를 가지고 : 당신이 볼 수 있듯이"궁극적으로 최종"변수에 대한 스레드 안전하지만 빠른 액세스?
class Server {
private WorkingThing worker;
public void init() {
runInNewThread({
// this will take about a minute
worker = new WorkingThing();
});
}
public Response handleRequest(Request req) {
if (worker == null) throw new IllegalStateException("Not inited yet");
return worker.work(req);
}
}
, 요청과 서버를 INITING 스레드를 처리하는 스레드가 있습니다. 초기화가 완료되기 전에 요청이 들어올 수 있으므로 IllegalStateException
으로 확인하십시오. 이제
null
-valued, 단지 초기화 후
worker
의 버전)이 스레드가 안전하게 그것을 동기화하거나 일부 이러한.
그러나 init이 완료된 후에 worker
은 다시 변경되지 않으므로 사실상 최종입니다. 따라서 발생할 수있는 잠금 충돌이 낭비되는 것처럼 보입니다. 그래서 내가 여기서 할 수있는 가장 효율적인 것은 무엇입니까?
이제 실용적인 의미로는 중요하지 않다는 것을 알았습니다. (네트워크 요청을 읽는 등 무거운 짐을 지거나, 단일 잠금이 중요한 것은 무엇입니까?)하지만 호기심을 알고 싶습니다. .
'synchronized'키워드를 사용하면 많은 비용이 소요됩니다. 가장 좋은 방법은'worker' 변수를'static' 변수로 만드는 것이라고 생각합니다. 이렇게하면 메모리에 예약 된 공간이 할당되고 스레드는 항상 해당 공간을 볼 것입니다. 그냥 생각이 맞지 않을 수도 있습니다. –
'worker.work (req)'의 호출은 안전합니까? 난 그냥 'worker' 초기화 될 때까지 호출 스레드를 차단할 필요가 있는지 확인하는 것입니다. 그 맞습니까? –
@ViktorSeifert 예, 일단 worker가 있으면 스레드로부터 안전합니다. –