Рассмотрим следующий код:Как реализовать спинлока, чтобы избежать блокировки
// Below block executed by thread t1
synchronized(obj) {
obj.wait(0);
}
// This block executed by thread t2
synchronized(obj) {
obj.notify();
}
Я понимаю, что в коде выше, если t1
взял владение синхронизированного блока и в то же время, если нить t2
пытается принять синхронизированный блок , то t2
подходит для ожидания ядра. Я хочу, чтобы избежать этой ситуации и вращать t2
перед блоком до t1
вызывает ожидания и оставляет право собственности на блок. Это возможно?
Пожалуйста, приложите больше усилий для форматирования своего сообщения, прежде чем нажимать submit - используйте предварительный просмотр, чтобы посмотреть, как будет выглядеть сообщение, и только отправьте его, когда он посмотрит, как вы хотите, чтобы он выглядел, если * вы * ответили на вопрос , –
Кроме того, есть ли у вас доказательства того, что это действительно вызывает проблему в вашем коде? Блокировка спина очень редко является правильным решением - и имейте в виду, что 't1' отменит блокировку, как только она называет' wait() ', поэтому окно возможностей для блокировки t2 действительно очень мало. –
Почему вы хотите это сделать? Вместо этого в одном потоке, ожидающем блокировки, у вас будет один поток, ожидающий блокировки, и в то же время теряющий процессорные циклы. –