После посещения javaday 2015 Kharkiv возникла мысль померить скорость работы разных иплементаций потокобезопасного счетчика. Участники забега:
- AtomicLong jre7
- AtomicLong jre8
- Synchronized
- RentrantLock nonFair
- LongAdder
Заметки java разработчика. Performance, грабли, костыли и прочии нанотехнологии
"A typical implementation will use ICMP ECHO REQUESTs
if the privilege can be obtained, otherwise it will
try to establish a TCP connection on port 7 (Echo) of the destination host."
/*
* Let's try to create a RAW socket to send ICMP packets
* This usually requires "root" privileges, so it's likely to fail.
*/
fd = JVM_Socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (fd != -1) {
/*
* It didn't fail, so we can use ICMP_ECHO requests.
*/
return ping4(env, fd, &him, timeout, netif, ttl);
}
/*
* Can't create a raw socket, so let's try a TCP socket
*/
fd = JVM_Socket(AF_INET, SOCK_STREAM, 0);
Получается, чтобы доступность хоста определялась с помощью ICMP запроса, приложение должно быть запущено с правами root. В противном случае будет использовать echo реквест по 7 TCP порту. Вот только не всегда можно запускать приложения от рута, да и не серьезное это решение какое-то. Чтоб создать "сырой" сокет не обязательно ж быть рутом. Достаточно разрешить это делать jvm. Делается это довольно просто:setcap cap_net_raw=ep /usr/lib/jvm/jdk/bin/java