2014-10-16 8 views
2

В своем недавнем интервью, объясняя ситуацию, они попросили, если процесс является поточно-Безопасен ли поток процесса?

Есть два синхронизированных методов один статическая и другой не статична т.е. не статический метод А и статический метод Б. Эти два метода получают доступ к общим данным.

Теперь поток A вызывает нестатический метод A и поток B вызывает статический метод B. Является ли этот поток безопасным и объясняет y?

ответ

5

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

Если потоки используют разные блокировки, ни одна из них не блокируется, и оба могут одновременно получать или изменять данные. Даже если потоки только обращаются к данным и не изменяют их, блокировка обеспечит видимость памяти. Без общей блокировки вы не можете полагаться на эту видимость. Неограниченный параллельный доступ будет безопасным только в том случае, если данные являются неизменяемыми и уже являются safely published.

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

public void yourInstanceMethod() { 
    synchronized(WhateverYourClassIs.class) { 
     // code accessing shared data 
    } 
} 
+0

Привет Натан, спасибо за ответ. Не могли бы вы объяснить это объяснение. – Anonymous

+1

@ Анонимный: не могли бы вы сообщить мне, какая часть вам непонятна? вы можете отредактировать вопрос, если вам нужно добавить дополнительные сведения. –

+0

Теперь я понял, есть ли способ решить это? – Anonymous

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