2014-02-19 3 views
-2

Класс имеет статический метод и нестатический метод, которые синхронизированы. Два потока пытаются получить доступ к этим методам, смогут ли они это сделать? есть ли какой-либо замок? какой тип замка?Синхронизация для статических и нестатических методов

+4

Прямо сейчас непонятно, что вы просите. Похоже, это Java? Добавьте этот тег. Также исправьте свою грамматику, а затем, наконец, добавьте свой код. – AndyG

ответ

1

При использовании слова synchronized по методу вы фактически блокируете this, например, метод и сам класс статического метода.

Например:

public class MyClass { 
    public synchronized void foo1() {} 

    public synchronized void foo2() {} 
} 

В этом примере, только один поток может ввести foo1() или foo2() одного и того же экземпляра. Так что, если у нас есть что-то вроде этого:

MyClass instance1 = new MyClass(); 
MyClass instance2 = new MyClass(); 

Так что возможно за нить, чтобы быть в foo1() для instance1 в то время как другой поток в foo1() из instance2. Но невозможно, чтобы 2 нити вводили foo1 от instance1Иfoo2 на instance1. Потому что они оба блокируются, используя this.

То же самое касается статического метода, но вместо этого они блокируют сам класс. Значение - один поток может ввести статический метод synchronized в определенной точке.

+0

Очень хорошее объяснение .. Большое вам спасибо. – Jawa

+0

@ user3117979 - Было бы неплохо, если бы вы могли принять ответ, если это так (отметьте знак V рядом с вопросом) – Avi

2

Они будут синхронизированы, но на разных объектах, и, следовательно, не будет защиты от их обоих одновременно работающих.

Метод экземпляра синхронизируется по экземпляру объекта, а статический метод синхронизируется с объектом класса.

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

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