Lock接口与对象

Lock lock = new ReentrantLock();

用接口使用一个对象,达到线程同步化

Lock lock = new ReentrantLock();
 
        Thread t1 = new Thread() {
            public void run() {
                try {
                    log("线程启动");
                    log("试图占有对象:lock");
 
                    lock.lock();//占有对象
 

                    log("占有对象:lock");
                    log("进行5秒的业务操作");
                    Thread.sleep(5000);
 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    log("释放对象:lock");
                    lock.unlock();//释放对象
                }
                log("线程结束");
            }
        };
        t1.setName("t1");
        t1.start();

————————————————————————————————————————————————————————

tryLock

Lock lock = new ReentrantLock();
 
        Thread t1 = new Thread() {
            public void run() {
                boolean locked = false;
                try {
                    log("线程启动");
                    log("试图占有对象:lock");
 
                    locked = lock.tryLock(1,TimeUnit.SECONDS);
                    if(locked){
                        log("占有对象:lock");
                        log("进行5秒的业务操作");
                        Thread.sleep(5000);//这5s因为自身lock无法让出cpu,5s之后unlock
                    }
                    else{
                        log("经过1秒钟的努力,还没有占有对象,放弃占有");
                    }
 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                     
                    if(locked){//不同处,需要进行判断
                        log("释放对象:lock");
                        lock.unlock();

                    }
                }
                log("线程结束");
            }
        };
        t1.setName("t1");
        t1.start();

————————————————————————————————————————————————————————

Condition condition = lock.newCondition();

condition.await();

condition.signal();

1. Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,Lock是代码层面的实现。

2. Lock可以选择性的获取锁,如果一段时间获取不到,可以放弃。synchronized不行,会一根筋一直获取下去。 借助Lock的这个特性,就能够规避死锁,synchronized必须通过谨慎和良好的设计,才能减少死锁的发生。

3. synchronized在发生异常和同步块结束的时候,会自动释放锁。而Lock必须手动释放, 所以如果忘记了释放锁,一样会造成死锁。

猜你喜欢

转载自blog.csdn.net/Whiteleaf3er/article/details/82710991