2014-01-18 8 views
2

У меня есть несколько запросов относительно синхронизации на Java. Я прочитал много контента в Интернете и накормил себя большим количеством информации и, следовательно, с несколькими сомнениями. Я расскажу о своих запросах, поэтому, пожалуйста, помогите мне с моими сомнениями.синхронизация в java (объектные и статические методы)

Объект синхронизации Уровень:

1) Для Следующий пример кода.

public synchronized void a(){ 
    //todo 
    } 
} 

Что будет использовать LOCK. Будет ли он автоматически блокироваться на «этом», как это у нас в случае ниже образца кода?

public void a(){ 
    synchronized (this) { 
     //TODO 
    } 
} 

2) У нас есть несколько блоков кода кода блокировки на «этом».

public void a(){ 
    synchronized (this) { 
     //TODO 
    } 
} 
public synchronized void b(){ 
    synchronized (this) { 
     //TODO 
    } 
} 

Так же это означает, что если блок коды Ь() заблокирован, то любой другой поток не сможет получить доступ к(), а в то же время, как у них есть замок на объекте (это)?

синхронизации уровня Класс:

3) Для следующего кода

public static void c(){ 

synchronized (Main.class) { 
     //todo 
    } 
}public static void d(){ 
    synchronized (Main.class) { 
     //todo 
    } 
}public static void e(){ 
    //no syncronization here 
} 

Вопрос 1: Если С() заблокирован будет любой другой поток сможет получить доступ д(), который синхронизирован блок также? Вопрос 2: Если c() находится под блокировкой, сможет ли любой другой поток получить доступ к e(), который является несинхронизированным методом?

+0

Я бы попробовал их, если бы был вами. –

+0

да, да, да! ..... – user2837260

+0

также попробуйте с каким-нибудь содержательным кодом .. поможет вам лучше понять .. вы почти там :) – user2837260

ответ

2
  1. Да «это» замок
  2. Да
  3. Замок на Main.class так, если замок в с уже приобрел d не может быть доступна другим потоком.

в пункте 3. e() всегда можно получить доступ к нескольким потокам независимо от того, что не синхронизировано.

Надеюсь, что поможет :)

+0

, если мы ставим методы в вопросе 3 как нестатические методы, и мы есть блокировка на «этом» ... тогда что произойдет в этом случае ... будет ли доступным e() для доступа, несинхронизированного? – tiger

+0

также для вашего ответа на вопрос 3 ... если d() и e() оба заблокированы, то это также подразумевает, что даже метод c() не сможет выполнить вызов d() или e() внутри блок синхронизации? – tiger

+0

не обращал внимания, что e() не синхронизирован, см. Измененный ответ. –

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