1、在毕老师的视频里,首先介绍的是synchronized关键字作为同步,紧接着在多生产者和多消费者的例子当中就引出了Lock接口和Condition接口。而在书中是先介绍的Lock核Condition接口。我感觉Lock和Con接口比较复杂,相比于synchronized关键字来说需要做的事情太多,很繁琐,虽然功能可能强大很多,但是对于初学者来说先接触一个简单的关键字,从而学习到同步的概念是比较好的。
2、书中有一个简单的Lock接口例子
1 private Lock myLock = new ReentrantLock();//创建一个Lock接口对象,不需要自己真的去实现这个接口,有现成的可以用 2 3 public void method() 4 { 5 myLock.lock();//获取一个锁 6 try //必须检查异常 7 { 8 System.out.println();//线程的功能代码 9 } 10 finally 11 { 12 myLock.unlock();//释放锁,写在finally当中以确保抛出异常时锁也能被正确的释放 13 } 14 }
在这个例子当中可以看到如何使用Lock接口。我觉得相比synchronized关键字来说比较不爽的一点就是必须要写try...finally语句,这让整个程序变得比较臃肿。
3、关于Condition接口,毕老师的视频里说的比较通俗易懂。这个接口是一个监视器接口,在之前使用syn关键字时一个锁只能拥有一个监视器,就是这个锁本身。但是现在可以通过Condition接口来创建任意多的监视器接口,每一个监视器接口相互独立(一定意义上),下面是例子。
import java.util.concurrent.locks.*; class resrouce //资源对象 { private String name; //生产的物品 private int count = 1; //生产的编号 private boolean flag = false; //判断是否需要生产 private Lock aLock = new ReentrantLock();//创建一个锁的对象,Lock是接口名称,R...Lock是一个实现了Lock的内部类 private Condition set_con = aLock.newCondition();//创建生产资源线程的监视器 private Condition out_con = aLock.newCondition();//创建消费资源线程的监视器 public void set(String aName) //资源类当中的生产资源方法 { aLock.lock(); //获取一个锁,锁名为aLock try { while(flag) //判断产品还在不在,如果还在就等待,不在就生产 { try{set_con.await();}//使用生产者监视器的等待方法,区别于Object的wait() catch(InterruptedException e){} } name = aName + count++; System.out.println(Thread.currentThread().getName()+"...生产者"+this.name); flag = true;//表示生产完毕 out_con.signal();//生产完毕后唤醒生产者的线程,而不是唤醒消费者的线程 } finally { aLock.unlock(); //释放一个锁,这个操作必须在final中使用,以防抛出异常后未释放锁 } } public void out() { aLock.lock(); try { while(!flag) { try{out_con.await();} //使用消费者监视器的等待方法 catch(InterruptedException e){} } System.out.println(Thread.currentThread().getName()+"...消费者...."+this.name); flag = false; set_con.signal(); } finally { aLock.unlock(); } } }
时间: 2024-10-12 17:44:19