/**
* jdk1.5之后出现了一些接口和类。
* Lock:比同步代码块和同步函数的效果和性能要好一些。
* 分析发现:无论是同步代码块还是同步函数,他们所做的都是隐式的锁的操作。
*
* 同步代码块和同步函数他们使用的锁的监视器都是同一个对象。
* lock接口就是将锁进行了单独的对象的封装,而且提供了锁对象的很多功能。
* lock() 获取锁。 unlock() 释放锁。
*
* lock对锁的操作都是显示操作。
* 所以他的出现比同步代码块和同步函数明显了很多,这更符合面向对象的思想。
*
* =======
* 原来在同步代码块或者同步函数中,锁和监视器是一个对象。
* 现在升级后,锁是一个单独的对象了。
* 而监视器的方法也被封装到了一个对象当中,这个对象就是Condition。
*
* 升级后,都进行了单独的封装。
* 锁被封装成了Lock对象。
* 监视器的方法被封装成了Condition对象。
*
* 如何让锁和监视器产生联系呢?
* 直接通过lock接口的newCondition方法就可以获得锁上面的监视器对象。
* */
//资源
class Resource2{
private String name;
private int count = 1;
private boolean flag; //判断盘子里是否有馒头的标志位。
//指定一把锁
private Lock lock = new ReentrantLock();
//获取锁的监视器
private Condition condition = lock.newCondition();
public void set(String name){
//获取锁
lock.lock();
try {
while (flag) {
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.name = name+count;
count++;
System.out.println(Thread.currentThread().getName()+"....生产了..."+this.name);
flag = true;
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock(); //释放锁
}
}
public void get(){
lock.lock();
try {
while (!flag) {
try {
condition.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"....消费了..."+this.name);
flag = false;
condition.signalAll();
} catch (Exception e) {
}finally {
lock.unlock();
}
}
}
//生成者
class Produce2 implements Runnable{
private Resource2 r;
public Produce2(Resource2 r) {
this.r = r;
}
@Override
public void run() {
while (true) {
r.set("馒头");
}
}
}
//消费者
class Customer2 implements Runnable{
private Resource2 r;
public Customer2(Resource2 r) {
this.r = r;
}
@Override
public void run() {
while (true) {
r.get();
}
}
}
public class LockDemo01 {
public static void main(String[] args) {
Resource2 r = new Resource2();
Produce2 p = new Produce2(r);
Customer2 c = new Customer2(r);
Thread t0 = new Thread(p);
Thread t1 = new Thread(p);
Thread t2 = new Thread(c);
Thread t3 = new Thread(c);
t0.start();
t1.start();
t2.start();
t3.start();
}
}