Единственное отличие: синхронизированные блоки допускают гранулярную блокировку в отличие от синхронизированного метода
В основном блок или методы synchronized
использовались для написания поточно-безопасного кода, избегая ошибок несогласованности памяти.
Этот вопрос очень старый, и многое изменилось за последние 7 лет.
Для обеспечения безопасности потоков были введены новые программные конструкции.
Вы можете обеспечить безопасность потоков, используя расширенный API параллелизма вместо блоков synchronied
. Эта документация page предоставляет хорошие программные конструкции для обеспечения безопасности потоков.
Блокировка объектов поддерживает блокировку идиом, которые упрощают многие параллельные приложения.
Исполнители определяют высокоуровневый API для запуска и управления потоками. Реализации исполнителя, предоставляемые java.util.concurrent, обеспечивают управление пулом потоков, подходящее для крупномасштабных приложений.
Параллельные коллекции упрощают управление большими коллекциями данных и могут значительно сократить потребность в синхронизации.
Атомные переменные имеют функции, которые минимизируют синхронизацию и помогают избежать ошибок согласованности памяти.
ThreadLocalRandom (в JDK 7) обеспечивает эффективную генерацию псевдослучайных чисел из нескольких потоков.
Лучшей заменой для синхронизированной является ReentrantLock , в которой используется Lock
API
Блокировка взаимного исключения с повторным входом с тем же базовым поведением и семантикой, что и для неявной блокировки монитора, доступ к которой осуществляется с помощью синхронизированных методов и операторов, но с расширенными возможностями.
Пример с замками:
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock(); // block until condition holds
try {
// ... method body
} finally {
lock.unlock()
}
}
}
См. Также java.util.concurrent и java.util.concurrent.atomic для других программных конструкций.
См. Также этот связанный вопрос:
Синхронизация против блокировки