Java多线程Lock对象常用方法(1)

来源:互联网 发布:淘宝店铺资质60000 编辑:程序博客网 时间:2024/05/16 09:17

Lock对象除了有给当前对象加锁的功能,还有一系列的方法可以使用,下面逐一学习。
getHoldCount():查询当前线程保持此锁定的个数

package com.lenovo.plm.dms.p18;import java.util.concurrent.locks.ReentrantLock;public class Service {    private ReentrantLock lock = new ReentrantLock();    public void service1(){        lock.lock();        System.out.println("service1 getHoldCount:"+lock.getHoldCount());        service2();        lock.unlock();    }    public void service2(){        lock.lock();        System.out.println("service2 getHoldCount:"+lock.getHoldCount());        lock.unlock();    }    public static void main(String[] args) {        Service service = new Service();        service.service1();    }}

执行结果如下:
service1 getHoldCount:1
service2 getHoldCount:2

getQueueLength():取得正在等待此锁定的线程数量

package com.lenovo.plm.dms.p19;import java.util.concurrent.locks.ReentrantLock;public class Service {    public ReentrantLock lock = new ReentrantLock();    public void service(){        lock.lock();        System.out.println(Thread.currentThread().getName() + " come in the method");        try {            Thread.sleep(Integer.MAX_VALUE);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            lock.unlock();        }       } }package com.lenovo.plm.dms.p19;public class Main {    public static void main(String[] args) {        final Service service = new Service();        Runnable runnable = new Runnable(){            @Override            public void run() {                // TODO Auto-generated method stub                service.service();            }        };        Thread[] threadArray = new Thread[10];        for(int i = 0;i<10;i++){            threadArray[i] = new Thread(runnable);        }        for(int i = 0;i<10;i++){            threadArray[i].start();        }        try {            Thread.sleep(2000);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        System.out.println(service.lock.getQueueLength());    }}

运行结果如下:
Thread-0 come in the method
9
getWaitQueueLength(Condition condition):取得等待此锁相关给定条件condition的线程数量。

package com.lenovo.plm.dms.p20;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class Service {    private ReentrantLock lock = new ReentrantLock();    private Condition condition = lock.newCondition();    public void waitMethod(){        lock.lock();        try {            condition.await();        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            lock.unlock();        }    }    public void signalMethod(){        lock.lock();        System.out.println("There are " + lock.getWaitQueueLength(condition) + " waiting condition");        condition.signal();        System.out.println("There are " + lock.getWaitQueueLength(condition) + " waiting condition");        lock.unlock();    }}package com.lenovo.plm.dms.p20;public class Main {    public static void main(String[] args) {        final Service service = new Service();        Runnable runnable = new Runnable(){            @Override            public void run() {                // TODO Auto-generated method stub                service.waitMethod();            }        };        Thread[] threadArray = new Thread[10];        for(int i = 0;i<10;i++){            threadArray[i] = new Thread(runnable);        }        for(int i=0;i<10;i++){            threadArray[i].start();        }        try {            Thread.sleep(2000);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        service.signalMethod();    }}

运行结果如下:
There are 10 waiting condition
There are 9 waiting condition

0 0