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()的作用分别是阻塞线程和解除阻塞线程