Любой код интерфейса БД абсолютно должен войти в управление версиями (Хранимые процедуры, Функции, и т.д.).
Для структуры и данных, это - личный выбор. Я лично сохраняю чистый структурный шаблон своих баз данных вокруг, но не храню их в управлении версиями, из-за размера. Но хранение его в управлении версиями может быть очень выгодным, даже для того, чтобы просто иметь историю.
Синхронизированный метод использует приемник метода как блокировку (то есть this
для нестатических методов и включающий класс для статических методов). Синхронизированные
блоки используют выражение в качестве блокировки.
Таким образом, следующие два метода эквивалентны перспективной блокировке:
synchronized void mymethod() { ... }
void mymethod() {
synchronized (this) { ... }
}
Для статических методов класс будет заблокирован:
class MyClass {
synchronized static mystatic() { ... }
static mystaticeq() {
syncrhonized (MyClass.class) { ... }
}
}
Для синхронизированных блоков вы может использовать любой объект, отличный от null
, в качестве блокировки:
synchronized (mymap) {
mymap.put(..., ...);
}
Область блокировки
Для синхронизированных методов блокировка будет удерживаться во всей области действия метода, а в блоке synchronized
, блокировка сохраняется только во время этой области действия блока (также известной как критическая секция). На практике,
Синхронизированный метод - это сокращение. Это:
class Something {
public synchronized void doSomething() {
...
}
public static synchronized void doSomethingStatic() {
...
}
}
для всех намерений и целей эквивалентно следующему:
class Something {
public void doSomething() {
synchronized(this) {
...
}
}
public static void doSomethingStatic() {
synchronized(Something.class) {
...
}
}
}
(где Something.class
- это объект класса для класса Something
.)
Так что, действительно, с синхронизированным блоком вы можете более точно указать свою блокировку и более детально определить, когда вы хотите ее использовать, но кроме этого нет никакой разницы.
Да, это одно отличие. Во-вторых, вы можете получить блокировку для других объектов, кроме этого
.
Синхронизированный метод блокирует экземпляр объекта, в котором содержится метод.
Где синхронизированный блок может блокировать ЛЮБОЙ объект - обычно объект мьютекса, определенный как переменная экземпляра. Это позволяет лучше контролировать, какие замки действуют.
Ключевое отличие состоит в следующем: если вы объявляете метод для синхронизации, то все тело метода становится синхронизированным; однако, если вы используете синхронизированный блок, вы можете заключить только «критическую часть» метода в синхронизированный блок, оставив остальную часть метода вне блока.
Если весь метод является частью критический раздел, то фактически никакой разницы нет. Если это не так, вам следует использовать синхронизированный блок только вокруг критической секции. Чем больше операторов в синхронизированном блоке, тем меньше общий параллелизм, поэтому вы хотите свести их к минимуму.