Прямо сейчас я пытаюсь узнать больше о java threading, и у меня есть небольшой вопрос, что я не могу найти прямой ответ нигде. Допустим, у меня есть два threadsthat как доля объекта:Вопрос о потоках и замках
public class FooA implements Runnable
{
Object data;
public FooA(final Object newData)
{
data = newData;
}
public void doSomething()
{
synchronized(data)
{
data = new Integer(1);
}
}
public void run() {
// Does stuff
}
}
public class FooB implements Runnable
{
Object data;
public FooB(final Object newData)
{
data = newData;
}
public void doSomething()
{
synchronized(data)
{
System.out.println(data);
}
}
}
Would FooA блок FooB, когда он находится в разделе DoSomething кода? Или наоборот? Чувство моего чувства говорит «да», но, согласно книге, которую я читаю, она говорит «нет». Отсюда необходимость в объектах мониторинга. Я сделал несколько более сложную версию этого, и все сработало нормально.
Я немного оглянулся, но не нашел конкретного ответа.
Если данные были изменяемыми, они будут затем блокировать каждый раз? – UberJumper
Если FooA указывает на другой объект, назначив новое значение элементу данных, FooB никогда не узнает и не узнает. Это не проблема как таковая. – djna
@uberjumper - вы имеете в виду, если данные были неизменными *? Если у 'data' не был присвоен новый объект (т. Е. Само поле' data' никогда не мутируется), и оба объекта построены с тем же объектом, который будет назначен их полям данных, тогда да, оба будут правильно блокировать друг друга, когда они синхронизируются на 'data'. –