Java милли второй точности - PullRequest
0 голосов
/ 02 декабря 2009

Есть ли Java API / предложение использовать вместо System.currentTimeMillis (), чтобы получить текущее время с точностью до миллисекунды для окон - требование двух последующих вызовов с временем ожидания 1 мс должно дать два разных времени - в настоящее время мне нужно явно спать в течение 15 мс, чтобы получить разное время

Ответы [ 9 ]

6 голосов
/ 02 декабря 2009

Не пытайтесь использовать время для создания уникальных значений. Используйте базу данных для генерации уникального идентификатора (ключ, который я предполагаю) для записи. Либо используйте поле с автоматическим приращением, либо создайте отдельную таблицу с одной записью, содержащей счетчик, который можно безопасно заблокировать и обновить.

Несмотря на то, что вы можете получить работающее решение, вы рассчитываете на время, чтобы предотвратить конфликт ресурсов.

5 голосов
/ 02 декабря 2009

Начиная с Java 1.5, вы можете использовать System.nanoTime() для микропроцессоров с более высокой точностью. Поскольку фиксированное время, на котором это основано, может измениться (см. Javadoc для метода), возможно, имеет смысл объединить его с System.currentTimeMillis(), например,

String time = System.currentTimeMillis() + "" + System.nanoTime();
3 голосов
/ 02 декабря 2009

Начиная с Java 1.5, вы можете использовать java.util.UUID для генерации уникальных идентификаторов.

* 1005 например *

   public static void main(String[] args)
   {
      System.out.println("uuid=" + UUID.randomUUID().toString());
      System.out.println("uuid=" + UUID.randomUUID().toString());
   }
3 голосов
/ 02 декабря 2009

Это ограничение Windows. Если вы вызываете System.currentTimeMillis () в других операционных системах, вы получаете гораздо более высокую точность.

Мой совет: не используйте метку времени в качестве источника уникальности. Используйте последовательность оракула, как она была разработана для этой проблемы. В противном случае используйте имя потока + метка времени (юк).

ИЛИ вы можете использовать System.nanoTime (), но это полезно только для разницы во времени, а не для абсолютного времени.

2 голосов
/ 02 декабря 2009

Разрешение вызова currentTimeMillis () зависит от базовой операционной системы и не должно использоваться для создания уникальных штампов в вашей ситуации. Подумайте о наличии UID-синглтона, который может дать вам длинное значение, которое увеличивается на единицу для каждого вызова, а затем использовать это.

1 голос
/ 02 декабря 2009

Здесь важно отличать точность от точности. System.currentTimeMillis() имеет точность в миллисекундах, но не дает никакой гарантии на точность, так как она получает это от базовой ОС, а ОС получает ее от аппаратного обеспечения, а разные аппаратные часы имеют разную точность.

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

1 голос
/ 02 декабря 2009

Зачем вам нужно, чтобы время было уникальным?

Найдите время в начале транзакции, затем добавьте одну MS для каждой вставки.

0 голосов
/ 02 декабря 2009

Ограничение в 15 мс по абсолютному разрешению по времени является особенностью вашей операционной системы и частоты прерываний. Я знаю, что для Linux есть патч ядра, чтобы увеличить разрешение до 1 мс (возможно, даже микросекунд?), Хотя не уверен насчет Windows. Как прокомментировали другие, относительное время можно определить с помощью System # nanoTime () (в настоящее время с точностью до микросекунд). В любом случае, вы должны рассмотреть возможность использования ключей db (или аналогичных) для назначения уникальных ключей.

Ссылки

0 голосов
/ 02 декабря 2009

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

Это, конечно, плохая идея, как подробно описано другими авторами здесь.

Если вы не можете использовать базу данных, то лучше использовать AtomicInteger или AtomicLong - тогда вы можете вызвать getAndIncrement() или incrementAndGet() и не беспокойтесь о любых проблемах синхронизации, которые могут возникнуть.

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