Concurrency,Java 并发

//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;
	}

}
原文地址:https://www.cnblogs.com/wucg/p/1989721.html