2013-02-26 5 views
1

Я нахожу фрагмент кода, который отлично работает до тех пор, пока блокировка не будет установлена ​​на уровне объекта, и когда одна и та же блокировка будет сделана статической окончательной (добавлено статическое ключевое слово), код начнет с сбоев с ошибками, связанными с параллелизмом.Блокировка уровня объекта и уровня класса

Должен ли замок, работающий на уровне объекта, работать повторно, когда его область становится статической? Я думал, что сделать блокировку как статическую, сделает ее более ограничительной и не должен начинать вызывать больше concurrencyissues, чем когда она была на уровне объекта. Однако я нахожу обратное.

+1

Возможно, вы можете опубликовать код? – radai

+0

также более конкретно об ошибках –

+0

Какие ошибки возникают? –

ответ

1

Должен ли замок, работающий на уровне объекта, работать с восстановителем, когда его объем становится статическим?

Если вы перемещаете замок от быть блокировки экземпляра быть статический замок, он не должен причиной проблемы параллелизма. Вы правы, что это должно сделать код более ограничительным в том, что будет использоваться один замок вместо нескольких блокировок экземпляров. Это, конечно, если этот замок составляет static final, и все места в вашем коде соответствующим образом блокируют его.

public static final Object lockObject = new Object(); 

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

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

+0

thx Gray, это было единственное сомнение, которое у меня было. И в последнее время я начал получать эти ошибки более случайными даже в случае блокировки уровня объекта. Я уточню свой вопрос позже с лучшей базой кода, чтобы обсудить оттуда. – fortm

0

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

На практике статический замок связан с классом, другими словами, один объект блокировки разделяется между всеми потоками. Обычно, поскольку больше потоков требует доступа к одной и той же блокировке, более вероятно, что вы столкнетесь с проблемами параллелизма (например, тупиками и голоданием), если в коде есть ошибка.

В качестве обобщения, если вы столкнулись с проблемами параллелизма с использованием блокировок на уровне объектов, у вас, вероятно, будет еще больше проблем при продвижении блокировок на уровень класса.

+0

более плохие новости для меня .. Я также получаю тупик, когда я делаю эти блокировки статическими. поэтому у вас есть домашняя работа: P – fortm

+0

Если ваша проблема связана с доступом к базе данных, попробуйте использовать библиотеку ORM, такую ​​как hibernate. В качестве альтернативы вы также можете попробовать изолировать вставки в отдельные транзакции SQL. – RudolphEst

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