Используйте ключевое слово synchronized
.
class sample {
private String msg=null;
public synchronized void newmsg(String x){
msg=x;
}
public synchronized string getmsg(){
String temp=msg;
msg=null;
return msg;
}
}
Использование ключевого слова synchronized
в методах потребует от потоков получить блокировку для экземпляра sample
.Таким образом, если какой-либо один поток находится в newmsg()
, никакой другой поток не сможет получить блокировку для экземпляра sample
, даже если он попытался вызвать getmsg()
.
В другомс другой стороны, использование synchronized
методов может стать узким местом, если ваши методы выполняют длительные операции - все потоки, даже если они хотят вызвать другие методы в этом объекте, которые могут чередоваться, все равно должны будут ждать.
IMO, в вашем простом примере можно использовать синхронизированные методы, поскольку у вас есть два метода, которые не должны чередоваться.Однако при других обстоятельствах может иметь смысл иметь синхронизируемый объект блокировки, как показано в ответе Джо Скита.