How to install JDK 11 on an AWS linux instance

#!/usr/bin/env bash
cd /usr/local/src
wget --no-cookies --header "Cookie: gpw_e24=xxx; oraclelicense=accept-securebackup-cookie;"
tar xzf jdk-11.0.1_linux-x64_bin.tar.gz
rm -rf jdk-11.0.1_linux-x64_bin.tar.gz
mv /usr/local/src/jdk-11.0.1 /usr/local/jdkv10
alternatives --install /usr/bin/java java /usr/local/jdkv11/bin/java 2
alternatives --install /usr/bin/jar jar /usr/local/jdkv11/bin/jar 2
alternatives --install /usr/bin/javac javac /usr/local/jdkv11/bin/javac 2
alternatives --set jar /usr/local/jdkv11/bin/jar
alternatives --set javac /usr/local/jdkv11/bin/javac
export JAVA_HOME=/usr/local/jdkv11
export PATH=$PATH:/usr/local/jdkv11/bin
  • Save it as:
  • Give it execution permission with
chmod +x
  • Run it with sudo:
sudo ./

The @ThreadSafe annotation

When you’re writing a library (or any code, really), you should make sure that you’re not only writing code which will cover your use case for it, but also that you’re doing it in a way that others could benefit from it. With this I don’t mean early optimisations, or functionality which could be easily labeled as YAGNI, let me be clear on that. But effective code should be self-explanatory, not only in the naming and its modularity, but also in the way it can be used. I found a great example of how to do this on the AWS SDK for Java, since I had to use it while trying AWS Lambda. I was trying to determine if I could safely reuse one of their clients when I stumbled upon this comment on StackOverflow about the @ThreadSafe annotation.

Place this annotation on methods that can safely be called from more than one thread concurrently. The method implementer must ensure thread safety using a variety of possible techniques including immutable data, synchronized shared data, or not using any shared data at all.

That’s exactly what I needed, official confirmation from the author of the library (in this case AWS) about its use on a multi-threaded context. It seems that the original idea for this annotation, and others, came in the “de-facto” Java concurrency bible, Java Concurrency in Practice.

AWS have their own implementation of the @ThreadSafe annotation.

 * Documenting annotation to indicate a class is thread-safe and may be shared among multiple threads.
 * @see NotThreadSafe
public @interface ThreadSafe {

And yes, the client I needed is thread-safe.