2013-10-06 3 views
0

Почему приведенный ниже фрагмент кода, связанный с несколькими примерами?Почему этот многопоточный код сломан?

public void method1(){ 
    synchronized(intVariable){ 
    } 
    synchronized(stringVariable){ 
    } 
} 

public void method2(){ 
    synchronized(stringVariable){ 
    } 
    synchronized(intVariable){ 
    } 
} 

Выше двух методов относятся к одному классу, где stringVariable и intVariable являются переменными экземпляра.

Я думал, что это не вызовет никаких проблем, по крайней мере, с помощью тупиковых тупиков. Есть ли другая причина, почему этот код нарушен?

+0

Вам лучше спросить об этом на странице programers.stackexchange.com, поскольку это не вопрос SO. – svz

+4

Этот вопрос, кажется, не по теме, потому что речь идет о вопросах и практике интервью. –

+0

. Часть о том, как иметь дело с интервью, будет лучше для программистов. Если вы спросите, может ли эта реализация вызвать какие-либо проблемы, которые вы не видели, возможно, здесь есть тема. –

ответ

9

Либо вы не поняли проблему, либо вы правы, что это не вызовет тупик.

Возможно, он искал что-то более неясным, как,

  • вы не можете заблокировать int поле.
  • блокировка объекта String - очень плохая идея, потому что вы не знаете, как это разделяется.

Но я в этом сомневаюсь. Во всяком случае, он должен был разъяснить вопрос и ваш ответ, потому что, возможно, он мог бы чему-то научиться, если только, как сделать вопрос более ясным в следующий раз.

Если у вас, как у интервьюера, есть набор вопросов для проверки, вы должны убедиться, что они закрыты, прежде чем вы даже принесете кандидата. Может оказаться полезной анкета для предоставления персоналу или агенту. Телефонное интервью часто является хорошим первым набором. Будучи кандидатом, я иногда прошу провести собеседование с телефоном, просто чтобы посмотреть, стоит ли мне тратить время на встречу. (например, если у меня есть серьезные сомнения, это стоит того)

Вы не только пытаетесь убедить их, что они вам подходят, но они пытаются убедить вас, что они подходят вам. Похоже, что им не удалось технически объяснить вам эту проблему и как они справились с этим человеком, поэтому я считаю, что вам повезло, что вы больше не тратите время на них.

BTW: Большинство крупных компаний разнообразны, и работа в одной команде может быть очень отличной от другой команды. Было бы несправедливо характеризовать компанию, основанную на одном опыте.

0

Проблема заключается в том, что обе переменные имеют ссылочный тип (иначе вы не могли бы синхронизировать их), что синхронизация на переменной, содержимое которой может изменить, нарушено.

Первое считывание переменной выполняется без синхронизации, и любая ссылка, которую будет видеть нить (которая может быть полностью устаревшей), используется для синхронизации, что не предотвращает синхронизацию других потоков от другого значения этого как это будет совсем другой объект.

С String и Integer неизменны каждое изменение значения переменной означает, изменяя ссылку, содержащуюся в переменной, позволяя другой поток, чтобы войти в блок synchronized в то время как поток выполнения изменение все еще внутри этого блока.

И из-за юридические порядка операций, она даже может показаться, что второй поток выполняет действия внутри блока synchronizedперед тем первого потока выполняет запись. Напомним, что чтение ссылки на использование для синхронизации не синхронизировано. Это похоже на отсутствие синхронизации вообще.

Смежные вопросы