Рассмотрим следующий пример:Несинхронизированный метод все равно может получить доступ, несмотря на блокировку объекта, почему?
class A {
public static void main(String[] args) throws InterruptedException
{
final A a = new A();
new Thread()
{
public void run()
{
a.intrudeLock();
};
}.start();
Thread.sleep(1000);
new Thread()
{
public void run()
{
a.doSomethingAfterLocking();
};
}.start();
}
synchronized void doSomethingAfterLocking() throws InterruptedException
{
System.out.println("aquired lock");
Thread.sleep(10000);
System.out.println("finished stuff");
}
void intrudeLock()
{
System.out.println("don't need object's lock");
}
}
Идя запирающего механизма - ожидаемый выход (по крайней мере, в большинстве случаев):
Приобрел замок
не нужен замок объекта
закончил материал
Я не спрашиваю, почему этот вывод, и понять причина, по которой второй поток не требует блокировки для вызова его метода и может, таким образом, вторгаться.
Теперь вот мое сомнение. Когда поток получает блокировку, его намерение приобретает исключительность над объектом, и интуитивно среда выполнения должна препятствовать изменению какого-либо состояния другими потоками. Но это не то, как Java реализует его. Есть ли причина, почему этот механизм был разработан так?
Поскольку объект заблокирован только от другой синхронизации. Потому что у Java нет мониторов Бринча Хансена. Потому что именно так они его и разработали. – EJP