1.手写实现生产者,消费者
生产者A将num更新成1,消费者将num更新成0,轮训执行10次。
public class LockDemo {
public static void main (String[] args) {
//实现生产者,消费者
// 判断等待,业务,通知
Data data = new Data();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
data.increment();
} catch (Exception e) {
e.printStackTrace();
}
}
}, "A").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
data.decrement();
} catch (Exception e) {
e.printStackTrace();
}
}
}, "B").start();
}
}
class Data {
private int num = 0;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void increment () {
lock.lock();
try {
while (num != 0) {
condition.await();
}
num = num + 1;
System.out.println(Thread.currentThread().getName() + "-> num:" + num);
condition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void decrement () {
lock.lock();
try {
while (num != 1) {
condition.await();
}
num = num - 1;
System.out.println(Thread.currentThread().getName() + "-> num:" + num);
condition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
顺序执行
package com.fp.coupon.rest.juc;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockDemo2 {
public static void main (String[] args) {
//实现生产者,消费者
// 判断等待,业务,通知
Data2 data = new Data2();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
data.A();
}
}, "A").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
data.B();
} catch (Exception e) {
e.printStackTrace();
}
}
}, "B").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
data.C();
} catch (Exception e) {
e.printStackTrace();
}
}
}, "C").start();
}
}
class Data2 {
private int num = 1;
Lock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
public void A () {
lock.lock();
try {
while (num != 1) {
condition1.await();
}
num = 2;
System.out.println(Thread.currentThread().getName() + "=> AAAAAA");
condition2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void B () {
lock.lock();
try {
while (num != 2) {
condition2.await();
}
num = 3;
System.out.println(Thread.currentThread().getName() + "=> BBBBBB");
condition3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void C () {
lock.lock();
try {
while (num != 3) {
condition3.await();
}
num = 1;
System.out.println(Thread.currentThread().getName() + "=> CCCCCC");
condition1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
狂神JUC笔记:https://www.kuangstudy.com/bbs/1374937897278402561