重入锁

来源:互联网 发布:双十一淘宝客服回复 编辑:程序博客网 时间:2024/05/01 15:40

重入锁完全可以替代synchronized关键字
重入锁使用java.util.concurrent.locks.ReentrantLock类来实现,下面是一段简单的案例

简单示例

public class ReenterLock {    static class Task implements Runnable{        static ReentrantLock lock = new ReentrantLock();        static int i = 0;        @Override        public void run() {            for(int j = 0 ;j<1000;j++){                try{                    lock.lock();                    i++;                }finally{                    lock.unlock();                }            }        }    }    public static void main(String[] args) throws InterruptedException {        Thread t1 = new Thread(new Task());        Thread t2 = new Thread(new Task());        t1.start();        t2.start();        t1.join();        t2.join();        System.out.println("i="+Task.i);    }}

使用重入锁的一些注意事项:
* 开发人员必须在线程结束的时候手动释放锁(不管程序是否抛出异常),考虑到代码可能抛出运行时异常,所以应该将释放锁的代码写在finally{}块中
* 一个线程可以连续获得一把锁多次,但是要注意最后释放的时候也要释放相同的次数,如果释放的次数大于获取的次数,那么会抛出IllegalMonitorStateException异常,如果释放的次数少的话,那么就证明该线程还持有锁对象,此时别的线程就没有办法进入临界区

中断

原创粉丝点击