2013-05-26 3 views
0

Я пытаюсь понять, как работают блокировки с использованием ключевых слов синхронизации в java. если IA есть класс (забыть о плохой практике и т.д. с общественным Варсом и т.д.)Модификатор синхронизации Java

class Person 
{ 
    public int money; 
    public String name; 

    public void give_bonus() 
    { 
     synchronize(this) 
     { 
      money += 10; 
      name = "...."; 
     } 
    } 
} 

// thread one 
person.give_bonus(); 

// thread two 
person.money += 50; 

Теперь мой вопрос, если я создать блок блокировки, используя блокировку экземпляра (это) будет ли это мешать другие потокам манипулирования деньги на недвижимость? или мне нужно сделать частное имущество денег и определить getter/setter с помощью модификатора синхронизации, чтобы убедиться, что это значение не рискует столкнуться с состоянием гонки?

ответ

2

Код, который вы предоставляете, предотвратит изменение других потоков от переменной money по методу give_bonus() до тех пор, пока метод не вернется (вернее, перед возвратом метода).

Как вы думаете, вам нужно будет сделать свою переменную private и добавить синхронизацию к методу установки, чтобы быть в безопасности. Просто убедитесь, что вы синхронизируете одну и ту же блокировку.

0

Вы можете думать об этом так, как будто каждому экземпляру объекта принадлежит один «билет» (его монитор). Когда поток хочет ввести блок, который является synchronized на конкретном объекте, поток должен сначала «получить билет» от объекта, а при выходе из блока или вызове wait() он передает билет обратно.

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

В вашем примере нет ничего, что могло бы остановить поток 2, получающий доступ к money напрямую - факт, что поток 1 находится в синхронизированном блоке, останавливает поток 2 только от входа в синхронизированный блок на том же мониторе.

1

Синхронизация на this не имеет ничего общего с содержанием объекта this. Механизм блокировки Java в основном представляет собой piggiebacks на обычных объектах, которые играют другую роль, полностью отделенную от их «объективности». Эта другая роль включает в себя специальное поле в каждом объекте, называемое его монитором, запись которого нить приобрела и сколько раз.