Некоторые вопросы по многопоточности Java,

У меня есть ряд вопросов, касающихся проблем многопоточности Java. Пожалуйста, окажите мне как можно больше помощи.

0) Предположим, у нас есть 2 банковских счета, и нам нужно переводить деньги между ними потокобезопасным способом. т.е.

accountA.money += transferSum; 
accountB.money -= transferSum; 

Существуют два требования:

  1. никто не должен иметь возможность видеть промежуточные результаты операции (т. е. одна сумма счета увеличивается, а другие еще не уменьшаются).
  2. доступ на чтение не должен блокироваться во время операция (т.е. во время продолжения операции должны отображаться старые значения сумм на счетах)

Вы можете предложить какие-нибудь идеи по этому поводу?

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

2) Как долго поток, разбуженный методом уведомления, может ждать блокировки? Предположим, у нас есть такой код:

synchronized(lock) {  
    lock.notifyall();   
    //do some very-very long activity  
    lock.wait() //or the end of synchronized block  
}  

Можем ли мы заявить, что хотя бы один поток завершится успешно и захватит блокировку? Может ли сигнал пропадать из-за таймаута?

3) Цитата из Java Concurrency Book:

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

Означает ли это, что единственная проблема безопасности потоков, которая остается для кода, выполняемого в однопоточный исполнитель - это гонка данных, и мы можем отказаться от изменчивых переменных и упустить из виду все проблемы с видимостью? Это похоже на универсальный способ решить большую часть проблем параллелизма.

4) Все стандартные методы получения и установки являются атомарными . Их не нужно синхронизировать, если поле помечено как изменчивое. - это правильно?

5) Инициирование статических полей и статических блоков выполняется одним потоком и, следовательно, не должно быть синхронизировано. - это правильно?

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

11
задан Frambot 12 July 2013 в 14:13
поделиться