与Synchronized相比,Lock用的是condition.await( );来等待其他线程,用condition.signalAll( ); 来唤醒全部线程。通过lock.newCondition();来拿到condition
package com.liao.lesson1;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test03 {
public static void main(String[] args) {
B b = new B();
new Thread(()->{
for (int i = 0; i < 10; i++) {
try {
b.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
try {
b.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
try {
b.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"C").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
try {
b.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"D").start();
}
}
class B{
private int number;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void increment() throws InterruptedException {
lock.lock();
try {
while (number!=0){
condition.await();
}
number++;
condition.signalAll();
System.out.println(Thread.currentThread().getName()+"--->"+number);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void decrement() throws InterruptedException {
lock.lock();
try {
while (number==0){
condition.await();
}
number--;
condition.signalAll();
System.out.println(Thread.currentThread().getName()+"--->"+number);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
问题:随机的状态
但是我们想要达到的效果是A->B->C->D按顺序执行
Condition精准的通知和唤醒线程
任何一个新的技术,绝对不是仅仅只是覆盖了原来的技术,而是有了优势和补充!