synchronized是内置的java关键字,lock是一个java类
synchronized无法判断锁的状态,lock可以判断是否获取到了锁
synchronized会自动释放锁,lock必须要手动释放锁!如果不释放锁,会导致死锁
synchronized 线程1(获得锁,阻塞)、线程2(等待、傻傻的等); lock锁有trylock方法尝试获取锁
synchronized 可重入锁,不可以中断的,非公平;lock,可重入锁,可以判断锁,非公平(可以自己设置)
synchronized 适合锁少量的代码同步问题,lock锁适合锁大量的同步代码
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插件快速发布