Объем блокировки в Вашем примере находится в неправильном месте - это должно быть в объеме свойства класса 'MyObject', а не это - контейнер.
, Если MyObject мой класс объекта просто используется для содержания данных, которые один поток хочет записать в, и другой (поток UI) для чтения с того времени Вас, возможно, не нуждался бы в методе set вообще и создал бы его однажды.
Также рассматривают, если размещение блокировок на уровне свойства является уровнем записи гранулярности блокировки; если больше чем одно свойство могло бы быть записано в то, для представления состояния транзакции (например: общие заказы и общий вес), затем могло бы быть лучше иметь блокировку на уровне MyObject (т.е. блокировку (myObject. SyncRoot)...)
Ваш экземпляр DateFormat, скорее всего, отображает значение по местному времени. При отображении вашего значения попробуйте следующее:
java.util.Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
java.sql.Timestamp ts = resultSet.getTimestamp(PUBLISH_TIME);
cal.setTime(ts);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss z");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(sdf.format(cal.getTime()));
EDIT: к вашему комментарию:
Что, если я использую GMT, будет ли это проблемой в SimpleDateFormat
SimpleDateFormat может использовать общие часовые пояса (GMT + / - n), RFC822 и текст («если у них есть имена», как указано в JavaDoc - см. этот пост для информации об именах).
java.util.Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
java.sql.Timestamp ts = resultSet.getTimestamp(PUBLISH_TIME, cal);
Это должно помочь!