如果让100个线程访问一个共享,
MessageDigest并让它们分别计算1,000,000个哈希,则在我的计算机上,第一个线程完成70,160ms,最后一个完成98,748ms。
如果线程
MessageDigest每次都创建一个新实例,那么第一个线程将在43,392ms内完成,最后一个58,691ms。
编辑:
实际上,在此示例中,只有两个线程,该示例创建新实例的运行速度更快。
import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Share { final byte[] bytes = new byte[100]; final MessageDigest sharedDigest; final ExecutorService pool; int threads = 100; Share() throws NoSuchAlgorithmException { sharedDigest = MessageDigest.getInstance("MD5"); pool = Executors.newFixedThreadPool(threads); } void go() { for (int i=0; i<threads; i++) { pool.execute(new Runnable() { public void run() { long start = System.currentTimeMillis(); for (int i=0; i<1000000; i++) { try { MessageDigest digest = MessageDigest.getInstance("MD5"); digest.reset(); digest.update(bytes); digest.digest(); } catch (Exception ex) { ex.printStackTrace(); } } long end = System.currentTimeMillis(); System.out.println(end-start); pool.shutdown(); } }); } } public static void main(String[] args) throws Exception { Share share = new Share(); share.go(); }}


