Во-первых, обратите внимание, что следующие фрагменты кода идентичны.
public void foo() {
synchronized (this) {
// do something thread-safe
}
}
и:
public synchronized void foo() {
// do something thread-safe
}
делают точно то же самое . Никакое предпочтение любого из них за исключением удобочитаемости кода и стиля.
при синхронизации методов или блоков кода важно знать , почему Вы делаете такую вещь, и , какой объект точно Вы блокируете, и для [1 116] что цель .
Также примечание, что существуют ситуации, в которых Вы захотите к клиентский, синхронизируются блоки кода, в которых монитор Вы просите (т.е. синхронизируемый объект) не обязательно this
, как в этом примере:
Vector v = getSomeGlobalVector();
synchronized (v) {
// some thread-safe operation on the vector
}
я предлагаю, чтобы Вы получили больше знания о параллельном программировании, оно будет служить Вам много, как только Вы знаете точно, что происходит негласно. Необходимо проверить Параллельное Программирование в Java, замечательной книге по предмету. Если Вы хотите быстрое погружение - в к предмету, проверяете Параллелизм Java Sun
Самый разумный способ сделать это - убрать временную часть из значений datetime и сравнить результаты, а лучший способ отделить временную часть от datetime выглядит следующим образом:
cast(current_timestamp as date)
Раньше я использовал и защищал процесс, который выглядел как одна из следующих двух строк:
cast(floor(cast(getdate() as float)) as datetime)
dateadd(dd,0, datediff(dd,0, getDate()))
Но теперь, когда Sql Server имеет тип Date
, который не содержит компонент времени, мало причина использовать любой из этих методов.
Еще одна вещь, о которой следует помнить, это то, что это все равно приведет к задержке запроса, если вам нужно сделать это для двух значений datetime для каждой строки в предложении where или условии соединения. Если возможно, вы хотите как-то разложить это на множители, чтобы они были максимально вычислены заранее, например, с использованием представления или вычисляемого столбца.
Наконец, обратите внимание, что функция DATEDIFF сравнивает количество пересеченных границ. Это означает, что разница в днях между '2009-09-14 11:59:59'
и '2009-09-15 00:00:01'
равна 1, хотя только Прошло 2 секунды, но РАЗНДАТ в днях между '2009-09-15 00:00:01'
и '2009-09-15 11:59:59'
все еще ноль, хотя прошло 86 398 секунд. На самом деле его вообще не волнует временной отрезок, а только границы. В зависимости от того, что пытается сделать ваш запрос, вы можете использовать это в своих интересах.
In my own work, when I wanted to determine that two dates were equal irrespective of time of day, I've used the following:
WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101)
Granted, "comparison" includes much more than equality and the above converts the dates to U.S.A format MM/DD/YYYY prior to making the comparison. So, performance implications and inability to compare date differences.
But...it does work.
Если одно из ваших бизнес-требований не удовлетворяется вашей моделью данных (например, у вас есть требование сравнивать даты, но вы не отслеживаете даты, а только дату -plus-times), обратите внимание на возможность настройки модели, а не на метод борьбы с ней.
Было бы возможно и полезно сохранить только дату в индексированном вычисляемом столбце или сохранить дату и временные части отдельно?