Существует ли в Java какой-либо механизм времени компиляции, позволяющий гарантировать, что использование определенного JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Существует ли в Java какой-либо механизм времени компиляции, позволяющий гарантировать, что использование определенного

Сообщение Anonymous »

В настоящее время в нашей кодовой базе есть класс, который использует ключевое слово Synchronized на уровне метода для обеспечения согласованности данных в многопоточных операциях. Выглядит это примерно так:

Код: Выделить всё

public class Foo
{
public synchronized void abc() { ... }

public synchronized void def() { ... }

//etc.
}
Приятно то, что любой, кто использует этот класс, получает синхронизацию бесплатно. Когда вы создаете экземпляр Foo, вам не нужно помнить о доступе к нему внутри синхронизированного блока или чего-то подобного.

К сожалению, похоже, что синхронизация на уровне методов больше не поможет. Вместо этого нам придется начать синхронизацию с самим Foo. Я не думаю, что что-то вроде java.util.concurrent.AtomicReference тоже поможет. Я хочу быть уверен, что никто больше не прикасается к экземпляру Foo во время выполнения определенной (и, возможно, несколько длительной) операции. Итак, теперь у нас в коде будут такие блоки:

Код: Выделить всё

Foo foo = new Foo(); //this got created somewhere

//somewhere else entirely
synchronized(foo)
{
//do operation on foo
foo.doStuff();
foo.doOtherStuff();
}
Итак, главное, что меня беспокоит, это то, что я и несколько разработчиков делимся этим кодом. Объекты Foo довольно распространены. Поскольку мы больше не получаем бесплатную синхронизацию на уровне метода, мы должны ВСЕГДА помнить о доступе к объекту Foo внутри синхронизированного блока.

Итак, мой вопрос заключается в том, есть ли в Java какой-либо механизм (встроенный или сторонний), позволяющий мне генерировать предупреждения или ошибки во время компиляции, если экземпляр Foo доступен вне синхронизированного блокировать?

В идеале это можно сделать с объявлением класса (пример приведен ниже):

Код: Выделить всё

@EnsureSynchronized
public class Foo
{
//etc.
}
Или что-то, что я мог бы сделать, объявив экземпляры Foo (пример приведен ниже):

Код: Выделить всё

@EnsureSynchronized
private Foo foo;
Я знаю, что если бы я действительно захотел, я мог бы написать для этого собственное правило FindBugs или PMD, но я надеялся, что что-то подобное уже существует.

Поэтому я спрашиваю вас, сообщество SO, если бы вы оказались в такой ситуации, как бы вы попытались обеспечить, чтобы объекты Foo всегда были доступны и изменены только внутри синхронизированного > блоки?

Подробнее здесь: https://stackoverflow.com/questions/775 ... use-of-a-p
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»