Я пишу свой код на Java, где я создаю объект и получаю его в двух разных потоках. Мой первый поток thread1
вызывает некоторые общедоступные методы для этого объекта во время выполнения.Проверка того, что объект имеет значение null в Java
final Thread thread1 = new Thread(){
@Override
public void run() {
myObj.pubFunc1();
myObj.puFunc2();
myObj.pubFunc3();
}
};
У меня есть еще один поток thread2
который может освободить этот объект и установить его в null
как:
final Thread thread2 = new Thread(){
@Override
public void run() {
myObj.release();
myObj = null;
}
};
Мой вопрос, если я должен поставить проверить null
вокруг каждого оператора в моем thread1
, как это?
final Thread thread1 = new Thread(){
@Override
public void run() {
if(myObj != null) {
myObj.pubFunc1();
}
if(myObj != null) {
myObj.pubFunc2();
}
if(myObj != null) {
myObj.pubFunc3();
}
}
};
ИЛИ достаточно одной проверки всех утверждений? Основной вопрос, который может возникнуть из этого, заключается в блокировке объекта, на котором мы сделали нулевую проверку? Как справиться с этой ситуацией. Какой шаблон проектирования следует использовать для обработки этой ситуации.
ПРИМЕЧАНИЕ: Я не хочу, чтобы три утверждения выполнялись обязательно, и я даже не хочу, чтобы эти три утверждения составляли атомную единицу. Я просто хочу выполнить операцию, если объект, который я выполняю операцию, не является нулевым.
Если объект может стать асинхронным, необходимо его проверить, и он должен быть либо «volatile», либо прочитан и написан только в «синхронизированных» блоках или методах. Это не «шаблон дизайна», это просто здравый смысл, возникающий из JLS. – EJP