Другой способ синхронизации метода - PullRequest
7 голосов
/ 30 марта 2011

Как синхронизировать метод в Java, кроме использования синхронизированного ключевого слова?

Ответы [ 6 ]

6 голосов
/ 30 марта 2011

Вы можете использовать пакет java.util.concurrent.locks, особенно интерфейс блокировки:

Lock l = ...; 
l.lock();
try {
    // access the resource protected by this lock
} finally {
    l.unlock();
}

См. здесь .

2 голосов
/ 30 марта 2011

Зависит от ваших конкретных потребностей.

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

1 голос
/ 30 марта 2011

Вы также можете использовать @ Synchronized из Project Lombok для генерации личного поля, которое будет использоваться в качестве блокировки для вашего метода.

1 голос
/ 30 марта 2011

Это зависит от того, что вы пытаетесь сделать. Вы смотрите из любопытства или есть конкретная причина?

Если вы пытаетесь ускорить свои многопоточные методы, попробуйте синхронизировать или заблокировать определенные разделы или вообще избежать проблем с потоками; создавать общие данные final, создавать статические (не общие) данные ThreadLocal, использовать атомарные типы из java.util.concurrent.atomic, использовать одновременные коллекции (из пакетов java.util.concurrent) и т. д.

Кстати, материал java.util.concurrent доступен только в Java5 и более поздних версиях, хотя существует проект для создания бэк-порта пакетов для Java 1.4 на http://backport -jsr166.sourceforge.net /

Я бы порекомендовал книгу Брайана Гетца «Параллелизм Java на практике».

1 голос
/ 30 марта 2011

вы можете использовать классы блокировки, представленные в пакете java.util.concurrent.locks

см. http://download.oracle.com/javase/1.5.0/docs/api/index.html?java/util/concurrent/locks/Lock.html

0 голосов
/ 30 марта 2011

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

private Object guard = new ...
public method(){
   synchronized(guard){
      \\method body
      ...
   }
} 

Хотя в большинстве случаев это говорит о том, что вы действительно должны разбить свой класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...