Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

среда, 31 августа 2011 г.

java.text.SimpleDateFormat и потоки

Использование класса java.text.SimpleDateFormat, не является потокобезопасным.

Например, вот такой код:


import java.text.*;

class MiscUtils {
public final static DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

public static String formatDate(Date date) {
return fmt.format(date);
}
}

//
// usage:
//
void anyMethod() {
Date date = getDate();
String s = MiscUtils.formatDate(date);
// now we have formatted date here!
}


может вызвать проблемы, если метод MiscUtils.formatDate будет одновременно вызван из нескольких потоков.

Вот выдержка со страницы Java Docs SimpleDateFormat:

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.


Решение 1.
Всякий раз, когда нужно отформатировать (или пропарсить) дату, создавать новый экземпляр java.text.SimpleDateFormat

Решение 2.
Создать свою, потокобезопасную реализацию форматтера с блэкджеком и шлюхами с синхронизацией:

public class ThreadSafeSimpleDateFormat {

private DateFormat df;

public ThreadSafeSimpleDateFormat(String format) {
this.df = new SimpleDateFormat(format);
}

public synchronized String format(Date date) {
return df.format(date);
}

public synchronized Date parse(String string) throws ParseException {
return df.parse(string);
}
}


Решение 3.
Заюзать какую-нибудь стороннюю бибилиотечку наподобие JodaTime или класс FastDateFormat из Apache Commons.

пятница, 19 августа 2011 г.

Эффективное копирование файлов в NIO

Эффективное копирование файлов в NIO:

 // Getting file channels

FileChannel in = new FileInputStream(source).getChannel();
FileChannel out = new FileOutputStream(target).getChannel();
 
// JavaVM does its best to do this as native I/O operations.
in.transferTo (0, in.size(), out);
 
// Closing file channels will close corresponding stream objects as well.
out.close();
in.close();

четверг, 11 августа 2011 г.

Установка Postgres-9.0 на Ubuntu 10.10

Сделаем установку Postgres-9.0 на Ubuntu 10.10.

1) В репах по-умолчанию нет пакета Postgres-9.0, поэтому добавим репозиторий, откуда будем качать пакеты:

deb http://ppa.launchpad.net/pitti/postgresql/ubuntu maverick main
deb-src http://ppa.launchpad.net/pitti/postgresql/ubuntu maverick main

добавляем в файл /etc/apt/sources.list. В итоге должны получить что-то вроде

$ cat /etc/apt/sources.list
deb http://ru.archive.ubuntu.com/ubuntu/ maverick main restricted
deb http://ru.archive.ubuntu.com/ubuntu/ maverick multiverse
deb http://archive.canonical.com/ubuntu maverick partner
deb http://archive.canonical.com/ maverick partner
deb http://ru.archive.ubuntu.com/ubuntu/ maverick-updates restricted main multiverse universe
deb http://security.ubuntu.com/ubuntu/ maverick-security restricted main multiverse universe
deb http://extras.ubuntu.com/ubuntu maverick main #Third party developers repository
# for postgres 9.0
deb http://ppa.launchpad.net/pitti/postgresql/ubuntu maverick main
deb-src http://ppa.launchpad.net/pitti/postgresql/ubuntu maverick main

:~$


2) Идем сюда: https://launchpad.net/~pitti/+archive/postgresql, смотрим значение ключа (сейчас это 8683D8A2) и добавляем ключ:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8683D8A2

3) Апдейтим репы:
sudo apt-get update

4) Останавливаем сервис Postgres 8:
~$ sudo service postgresql-8.4 stop

5) Пуржим пакеты:
sudo apt-get purge postgresql*

6) Устанавливаем postgres 9.0
sudo apt-get install postgresql-9.0

7) Заходим в psql:
sudo -u postgres psql

Ссылки:
Install PostgreSQL 9 on Ubuntu Linux
Postgres 9.x installation in Ubuntu
Установка Postgresql 9, pgAdmin III в Ubuntu 10.04
Installing PostgreSQL 9.0 on Ubuntu 10.04

Как узнать, какую версию Ubuntu вы используете


user1:~$ cat /etc/issue
Ubuntu 10.10 \n \l

user1:~$


или через GUI: System -> Administration -> System Monitor

или:


user1:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 10.10
Release: 10.10
Codename: maverick

Установка пароля админа в Glassfish 3

Как установить админский пароль в Glassgish v3:

  1. Запустить Glassfish - GF_HOME/glassfish/bin/startserv

  2. Вызвать скрипт asadmn: GF_HOME/bin/asadmin change-admin-password




~/dev/glassfishv3/bin$ ./asadmin change-admin-password
Enter admin user name [default: admin]> admin
Enter admin password>
Enter new admin password>
Enter new admin password again>

Command change-admin-password executed successfully.
~/dev/glassfishv3/bin$

вторник, 9 августа 2011 г.

Определение страны пользователя в Google App Engine

Теперь в заголовке X-AppEngine-country пользовательского запроса передается двухбуквенный код страны.

воскресенье, 7 августа 2011 г.

HashMap, LinkedHashMap и TreeMap в Java

Вкратце, чем различаются между собой HashMap, LinkedHashMap и TreeMap из пакета java.util?

Все три класса имплементируют интерфейс java.util.Map. Но в каждой реализации есть всякие "плюшечки":


  • HashMap - не дает никаких гарантий по поводу порядка итерации по элементам. Скорость доступа: O(1).

  • LinkedHashMap - итерация по элементам в том же порядке, в котором они были вставлены в коллекцию, т.е. в insertion order. Скорость доступа: O(1).

  • TreeMap - держит коллекцию отсортированной по ключам (используется либо метод compareTo() либо предоставленный компаратор), поэтому итерация по элементам будет в порядке сортировки по ключам - natural ordering. Скорость доступа: O(log(n)).

Постоянные читатели