synchronized:排它锁,不公平锁,悲观锁;
wait(),notify(),notifyAll()只能用于同步代码块,同步方法中,实现线程的通信;
静态方法中没有this,this存在于实例方法,构造方法,实例代码块中
ReentrantLock:可重入锁,独占锁;
ReentrantLock lock=new ReentrantLock();
默认为false;
ReentrantLock lock=new ReentrantLock(true);
true表示公平锁;
RenntrantLock要与Condition结合实现线程的通信;
Condition中的await()和signal(),signalAll(),在这些方法使用之前必须要先获得锁lock(),在使用结束之后在finally{}中释放锁unLock();

public class Container<T> {
	/**用于存储数据的数组*/
	private Object[] array;
	/**记录有效元素个数*/
	private int size;
	
	
	public Container() {
		this(16);
	}


	public Container(int cap) {
		array=new Object[cap];
	}
	//true表示公平锁
	private ReentrantLock lock=new ReentrantLock(true);
	private Condition producerCondition = lock.newCondition();
	private Condition consumerCondition = lock.newCondition();
	/**
	 * 数据永远放在size位置
	 * @param t
	 * 说明:实例方法中的this永远指向调用此方法的实例对象
	 * this不能用于静态方法中,只能让用于构造方法,实例方法,实例代码块
	 * 
	 */
	public  void put(T t){
		lock.lock();
		try{
		//1.判定容器是否已满,满了则等待
		while(size==array.length){
			try {
				producerCondition.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//2.放数据
		array[size]=t;
		//3.有效元素个数加1
		size++;
		//4.通知消费者取数据
		consumerCondition.signalAll();
		}finally{
			lock.unlock();
		}
	}
	/**
	 * 位置:永远取下标为0的位置的数据
	 * @return
	 */
	public  T take(){
		lock.lock();
		try{
		//1.判定容器是否为空
		//用if会有虚假唤醒 
		while(size==0){
			try {
				consumerCondition.await();
			} catch (Exception e) {}
		}
		//2.取数据
		@SuppressWarnings("unchecked")
		T t=(T)array[0];
		//3.移动元素
		for(int i=1;i<size;i++){
			array[i-1]=array[i];
		}
		/**System.arraycopy(
				array, 
				1, 
				array, 
				0, 
				size-1);*/
		//4.有效元素个数减一
		size--;
		//5.将size位置为null
		array[size]=null;
		//6.通知生产者放数据
		producerCondition.signalAll();
		return t;
		}finally{
			lock.unlock();
		}
		
	}
}

LockSupport:是用来创建锁和其他同步类的基本线程阻塞;
LockSupport:中的park()和unPark()的作用分别是阻塞线程和解除阻塞线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值