Почему ключевое слово synchronize не используется с примитивной переменной. Использовать только с методом и синхронизированным блоком

В java есть synchronize keyword, который используется, чтобы избежать одновременного доступа нескольких потоков к методу или блоку синхронизации.

Мой вопрос в том, почему synchronize keyword не используется с примитивными переменными? Я знаю, что java не разрешено ключевое слово synchronized с переменной. Но мой вопрос в том, почему java не разрешает использовать ключевое слово синхронизации с переменной. В чем проблема, если предположим, что мы используем ключевое слово синхронизации с переменной?

Примитивные переменные похожи на int, float и т.д.

e.g.

int a=1
synchronized(a)

person PTech    schedule 17.04.2014    source источник
comment
Что вы имеете в виду под переменной? Вы имеете в виду примитивную переменную?   -  person Abimaran Kugathasan    schedule 17.04.2014
comment
@Кугатасан Абимаран. - Да, я имею в виду примитивную переменную. как int, float и т. д. например. синхронизировать в   -  person PTech    schedule 17.04.2014


Ответы (4)


Переменная сама по себе не стоит сама по себе. Ему нужен класс, чтобы иметь некоторый контекст. Вот почему блокировка находится в классе или объекте, а не в переменной.

person user3276247    schedule 17.04.2014

Полагаю, под переменной вы имели в виду поля класса. Но это не то, как синхронизация работает в Java.

Целью блока или метода synchronized является предотвращение одновременного изменения состояния переменной класса несколькими потоками. Синхронизация в Javaworks путем владения блокировкой — если у вас есть синхронизированный метод, вы используете встроенную блокировку объекта, в противном случае вам нужно предоставить блокировку. Если бы поля были объявлены как synchronized, это более или менее заставило бы все методы в этом классе, которые используют поле, работать синхронно, владея блокировкой, и это было бы плохо для производительности.

Если вам нужны гарантии синхронизации на уровне поля без необходимости синхронизации методов, рассмотрите возможность использования Атомарные переменные, такие как java.util.concurrent.atomic.AtomicInteger

person senseiwu    schedule 17.04.2014

Вы также можете синхронизировать переменную.

synchronized(myvariable) {
.......
}

Также вы должны проверить ключевое слово volatile. http://en.wikipedia.org/wiki/Volatile_variable#In_Java

person Dávid Szabó    schedule 17.04.2014
comment
Я думаю, что этот вопрос касается переменных примитивного типа данных, таких как int, float и т. д. - person PetrS; 17.04.2014
comment
Я разместил ответ для примитивов - person niiraj874u; 17.04.2014
comment
@ user1906108 - Ваш ответ похож на синхронизированный блок. Я отредактировал свой вопрос. - person PTech; 17.04.2014
comment
Да, я вижу это прямо сейчас. Но это не ответ на вопрос, потому что ОП хочет знать причину, а не решение. - person PetrS; 17.04.2014
comment
@ PS стекла - Да, я хочу, чтобы причина. - person PTech; 17.04.2014

Вы хотите сказать, что вам нужно синхронизировать операции над переменной? например, вы хотите защитить операцию над переменной, например. прибавлять, декрементировать? java имеет атомарный API, такой как java.util.concurrent.AtomicBoolean и т. д..

Преимущества использования классов Atomic Concurrency заключаются в том, что нам не нужно беспокоиться о синхронизации в каждом месте, где мы имеем дело с целыми числами, и предполагается, что она более эффективна, чем синхронизация, включающая блокировку ресурсов.

person niiraj874u    schedule 17.04.2014