Synchronized方式实现
public class demo {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(() -> {
while(true) {
try {
ticket.increase();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(() -> {
while(true) {
try {
ticket.decrease();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
class Ticket {
int number = 0;
public synchronized void increase() throws InterruptedException {
while (number != 0) {
this.wait();
}
number++;
System.out.println("increase--> " + number);
this.notify();
}
public synchronized void decrease() throws InterruptedException {
while (number == 0) {
this.wait();
}
number--;
System.out.println("decrease--> " + number);
this.notify();
}
}
用Lock方式实现
package Demo;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class demo {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(() -> {
while(true) {
try {
ticket.increase();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(() -> {
while(true) {
try {
ticket.decrease();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
class Ticket {
int number = 0;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void increase() throws InterruptedException {
lock.lock();
while(number != 0) {
condition.await();
}
number++;
System.out.println("increase--> " + number);
condition.signalAll();
lock.unlock();
}
public void decrease() throws InterruptedException {
lock.lock();
while(number == 0) {
condition.await();
}
number--;
System.out.println("decrease--> " + number);
condition.signalAll();
lock.unlock();
}
}