Lock + Condition 2个例子

1、自定义有边界的队列

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class MyQueue<E> {

	private Object[] obj;

	private int addIndex;
	private int removeIndex;
	private int queueSize;

	private Lock lock = new ReentrantLock();
    // 取代 wait notify
	Condition addCondition = lock.newCondition();
	Condition removeCondition = lock.newCondition();

	public MyQueue(int count) {
		obj = new Object[count];
	}

	public void add(E e) {
		lock.lock();
		while (queueSize == obj.length) {
			try {
				addCondition.await();
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
		}
		obj[addIndex] = e;

		if (++addIndex == obj.length) {
			addIndex = 0;
		}

		queueSize++;
		removeCondition.signal();
		lock.unlock();
	}

	public void remove() {
		lock.lock();

		while (queueSize == 0) {
			try {
				removeCondition.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		obj[removeIndex] = null;

		if (++removeIndex == obj.length) {
			removeIndex = 0;
		}

		queueSize--;

		addCondition.signal();

		lock.unlock();
	}
	
}

2、自定义数据库连接池

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class MyDataSource {

	private LinkedList<Connection> pool = new LinkedList<>();

	private static final int INIT_CONNECTIONS = 10;

	private static final String DRIVER_CLASS = "";

	private static final String USER = "";

	private static final String PASSWORD = "";

	private static final String URL = "";

	private Lock lock = new ReentrantLock();
	private Condition c1 = lock.newCondition();

	static {
		try {
			Class.forName(DRIVER_CLASS);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	public MyDataSource() {
		for (int i = 0; i < INIT_CONNECTIONS; i++) {
			try {
				Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
				pool.addLast(conn);
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	
	public Connection getConnect() {
		Connection result = null;
		lock.lock();
		try {
			while (pool.size() <= 0) {
				try {
					c1.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			if (!pool.isEmpty()) {
				result = pool.removeFirst();
			}
			return result;
		} finally {
			lock.unlock();
		}
	}

	public void release(Connection conn) {
		if (conn != null) {
			lock.lock();
			try {
				pool.addLast(conn);
				c1.signal();
			} finally {
				lock.unlock();
			}
		}
	}

}

猜你喜欢

转载自blog.csdn.net/SHIYUN123zw/article/details/83051278