Ориентированный на многопотоковое исполнение в Java 5 +:
class Foo {
private static volatile Bar bar = null;
public static Bar getBar() {
if (bar == null) {
synchronized(Foo.class) {
if (bar == null)
bar = new Bar();
}
}
return bar;
}
}
<час> РЕДАКТИРОВАНИЕ : Обратите внимание на volatile
модификатор здесь.:) Это важно, потому что без него, другие потоки, как гарантирует JMM (Модель памяти Java), не будут видеть изменений в ее значении. Синхронизация не делает , заботятся о том - она только сериализирует доступ к тому блоку кода.
РЕДАКТИРОВАНИЕ 2 : ответ @Bno детализирует подход, рекомендуемый Bill Pugh (FindBugs), и является спорным лучше. Пойдите чтение и проголосуйте за его ответ также.
That's an interesting question.
First things first: I get the same results on JRE6. I even get that when I lop off the toURL() part.
RFC2396 does not actually require two slashes. According to section 3:
The URI syntax is dependent upon the scheme. In general, absolute URI are written as follows:
:
Having said that, RFC2396 has been superseded by RFC3986, which states
The generic URI syntax consists of a hierarchical sequence of omponents referred to as the scheme, authority, path, query, and fragment.
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" путь к авторитету-abempty / путь-абсолютный / path-rootless / путь-пустой
Схема и компоненты пути требуется, хотя путь может быть пустым (без символов). Когда авторитет присутствует, путь должен быть пустым или начинаются с символа косой черты ("/"). Когда авторитета нет, путь не может начинаться с двух косых черт символы ("//"). Эти ограничения привести к пяти различным правилам ABNF для пути (раздел 3.3) только один из который будет соответствовать любому заданному URI ссылка.
Итак, поехали. Поскольку URI файлов не имеют сегмента полномочий, им запрещено начинаться с //.[1216 impression Однако этот RFC не появлялся до 2005 года, а Java ссылается на RFC2396, поэтому я не знаю, почему он следует этому соглашению, как URL-адреса файлов до нового RFC всегда имели две косые черты.
Что касается его использования в браузер обеспокоен, это не имеет значения. Обычно я видел file: /// ...
но один, два или три '/' будут работать. Это заставляет меня думать (не глядя на документацию по java), что это было бы нормальным поведением.