//TestLock.java package com.test.thread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TestLock { private static int cnt=0; private final int num=cnt++; private static Lock lock=new ReentrantLock(); private TestLock(){} private static TestLock ins=null; public static /*synchronized */ TestLock getInstance(){ if(ins==null){ //若在此处声明锁,则不能保证多个线程访问时,此段代码的安全 //Lock lock=new ReentrantLock(); lock.lock(); try { if (ins== null) { TimeUnit.MILLISECONDS.sleep(10); ins = new TestLock(); } } catch (InterruptedException e) { e.printStackTrace(); } finally{ lock.unlock(); } } return ins; } public int getNum() { return num; } /** * @param args */ public static void main(String[] args) { ExecutorService svs = Executors.newCachedThreadPool(); List< Future<TestLock> > lstObjs=new ArrayList< Future<TestLock> >(); for (int i = 0;i<10;i++){ lstObjs.add( svs.submit(new TestLockThread()) ); } for (Future<TestLock> ftl : lstObjs) { try { TestLock tl= ftl.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } svs.shutdown(); } } //TestLockThread.java package com.test.thread; import java.util.concurrent.Callable; public class TestLockThread implements Callable<TestLock> { @Override public TestLock call() throws Exception { TestLock tl = TestLock.getInstance(); System.out.println("call:"+tl.getNum()); return tl; } }