Updating list of string while other threads are reading from it
Yes if you only read the whitelist.

You can guarantee this at runtime by wrapping it in Collections.unmodifiableList while setting.

whitelist.set(Collections.unmodifiableList(tempList));


However because you don't use any other feature of the AtomicReference other than get and set, you don't need AtomicReference at all (or if you do it should be final); just volatile is enough:

private volatile List&lt;String&gt; whitelist = Collections.emptyList();//empty dummy list

whitelist = Collections.unmodifiableList(tempList);


And check with if (whitelist.contains(hash)) return null;

That leads me to the list itself; if you only check whether a values is contained within the list then you should consider changing the list to a HashSet.

private volatile Set&lt;String&gt; whitelist = Collections.emptySet();

Set&lt;String&gt; tempList = new HashSet&lt;String&gt;();
for (File f : scriptWhitelistDirectory.listFiles()){
    tempList.add(f.getName());
}
whitelist = Collections.unmodifiableSet(tempSet);