这是自JDK5.0开始提供的Java并发包里面的类
下面是关于Java并发锁的测试代码
- packagecom.jadyer.thread.lock;
- importjava.util.concurrent.locks.Lock;
- importjava.util.concurrent.locks.ReentrantLock;
- /**
- *LockTest
- *@author宏宇
- *@createMar1,20127:12:04PM
- */
- publicclassLockTest{
- publicstaticvoidmain(String[]args){
- FoodCenterfc=newFoodCenter();
- newThread(newThreadDog(fc,"Itisdog`sfood")).start();
- newThread(newThreadPig(fc,"Itispig`sfood")).start();
- }
- }
- classThreadDogimplementsRunnable{
- privateFoodCenterfc;
- privateStringfoodname;
- publicThreadDog(FoodCenterfc,Stringfoodname){
- this.fc=fc;
- this.foodname=foodname;
- }
- @Override
- publicvoidrun(){
- while(true){
- try{
- Thread.sleep(1000);
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }
- fc.getFood(foodname);
- }
- }
- }
- classThreadPigimplementsRunnable{
- privateFoodCenterfc;
- privateStringfoodname;
- publicThreadPig(FoodCenterfc,Stringfoodname){
- this.fc=fc;
- this.foodname=foodname;
- }
- @Override
- publicvoidrun(){
- while(true){
- try{
- Thread.sleep(2000);
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }
- fc.getFood(foodname);
- }
- }
- }
- /**
- *@see=========================================================================================
- *@seejava.util.concurrent是JDK5.0开始提供的Java并发包,其子包locks是专门用于处理线程锁的
- *@seejava.util.concurrent.locks.Lock较synchronized关键字比,有一个最大的区别,那就是
- *@seeLock可以比synchronized更细粒度的控制锁,体现在try{...}finally{mylock.unlock();}
- *@see=========================================================================================
- *@seeLock有点像公共厕所的门闩,只有正在使用厕所的人,把门闩打开出来了,其它人才可以使用公厕
- *@seeLock比传统线程模型中的synchronized方式更加面向对象。与生活中的锁类似,锁本身也应该是一个对象
- *@see两个线程执行的代码片段要实现同步互斥的效果,那么这两个线程所使用的必须是同一个Lock对象
- *@see并且,锁应该位于待操作的资源类的内部方法中,而非线程代码中
- *@see=========================================================================================
- */
- classFoodCenter{
- Lockmylock=newReentrantLock();//创建一个锁
- publicvoidgetFood(Stringname){
- intlen=name.length();
- mylock.lock();//上锁
- try{
- for(inti=0;i<len;i++){
- System.out.print(name.charAt(i));
- }
- System.out.println();
- }finally{
- mylock.unlock();//解锁
- }
- }
- }
下面是关于Java读写锁的测试代码
- packagecom.jadyer.thread.lock;
- importjava.util.concurrent.locks.ReadWriteLock;
- importjava.util.concurrent.locks.ReentrantReadWriteLock;
- /**
- *Java读写锁
- *@see锁分为读锁和写锁。多个读锁不互斥。读锁与写锁互斥。写锁与写锁互斥。这是由JVM自己控制的
- *@see如果代码只读数据,可以很多人同时读,但不能同时写,那就上读锁
- *@see如果代码修改数据,并且不允许同时读,只能一个人写,那就上写锁
- *@see总之:读的时候上读锁,写的时候上写锁
- */
- publicclassReadWriteLockDemo{
- privateObjectmyData=null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据
- ReadWriteLockrwl=newReentrantReadWriteLock();
- publicvoidget(){
- rwl.readLock().lock();//读锁
- try{
- System.out.println(Thread.currentThread().getName()+"bereadytoreaddata");
- Thread.sleep((long)(Math.random()*1000));
- System.out.println(Thread.currentThread().getName()+"havereaddata:"+myData);
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }finally{
- rwl.readLock().unlock();
- }
- }
- publicvoidput(Objectdata){
- rwl.writeLock().lock();//写锁
- try{
- System.out.println(Thread.currentThread().getName()+"bereadytowritedata");
- Thread.sleep((long)(Math.random()*1000));
- this.myData=data;
- System.out.println(Thread.currentThread().getName()+"havewritedata:"+myData);
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }finally{
- rwl.writeLock().unlock();
- }
- }
- }