I suspect that 'hasher.java' should also contain
public boolean meetsTarget(int nonce, Hasher hasher) throws GeneralSecurityException {....}
Specifically because hasher has been threaded and is called from
meetsTarget on each thread for every nonce, therefore it may become reentrant but it has not been synchronized.
Really there should be one nonce check routine for each hasher.
I suspect that 'hasher.java' should also contain
public boolean meetsTarget(int nonce, Hasher hasher) throws GeneralSecurityException {....}
Specifically because hasher has been threaded and is called from
meetsTarget on each thread for every nonce, therefore it may become reentrant but it has not been synchronized.
Really there should be one nonce check routine for each hasher.