lock锁

Synchronized和lock的区别

  1. synchronized是内置的java关键字,lock是一个java类

  2. synchronized无法判断锁的状态,lock可以判断是否获取到了锁

  3. synchronized会自动释放锁,lock必须要手动释放锁!如果不释放锁,会导致死锁

  4. synchronized 线程1(获得锁,阻塞)、线程2(等待、傻傻的等); lock锁有trylock方法尝试获取锁

  5. synchronized 可重入锁,不可以中断的,非公平;lock,可重入锁,可以判断锁,非公平(可以自己设置)

  6. synchronized 适合锁少量的代码同步问题,lock锁适合锁大量的同步代码

Condition精准唤醒

public class JUCController {

private int number = 0;

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();

Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();

public void increment() {
    lock.lock();
    try {
        //此处不能用if,会造成虚假唤醒
        while (number != 0) {
            //等待
            condition.await();
        }
        number++;
        condition.notifyAll();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}

public void decrement() {
    lock.lock();
    try {
        while (number == 0) {
            condition.await();
        }
        number--;
        condition.notifyAll();
    } catch (InterruptedException e){
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}

//精准唤醒
public void A(){
    lock.lock();
    try {
        //此处不能用if,会造成虚假唤醒
        while (number != 0) {
            //等待
            condition1.await();
        }
        number=1;
        condition2.signal();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}

public void B(){
    lock.lock();
    try {
        //此处不能用if,会造成虚假唤醒
        while (number != 0) {
            //等待
            condition2.await();
        }
        number=2;
        condition3.signal();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}

public void C(){
    lock.lock();
    try {
        //此处不能用if,会造成虚假唤醒
        while (number != 0) {
            //等待
            condition3.await();
        }
        number=3;
        condition1.signal();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}

}


本文章使用limfx的vscode插件快速发布