У меня есть ряд вопросов, касающихся проблем многопоточности Java.Пожалуйста, предоставьте мне как можно больше помощи.
0) Предположим, у нас есть 2 банковских счета, и нам необходимо перевести деньги между ними в поточно-ориентированном виде.т.е.
accountA.money += transferSum;
accountB.money -= transferSum;
Существуют два требования:
- никто не должен видеть промежуточные результаты операции (то есть одна сумма счета увеличивается, но другие еще не уменьшаются)
- доступ к чтению не должен блокироваться во время операции (т. Е. Старые значения сумм счетов должны отображаться во время операции)
Можете ли вы предложить некоторые идеи по этому поводу?
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 (), но не должен это делатьесли он выйдет из блокировки, выйдя из синхронизированного блока?