一、题目
三个售票员卖30张票
二、代码
1.synchronized版
package com.xxx;
class Ticket{
private int number = 30;
public synchronized void sale(){
if (number > 0){
number--;
System.out.println(Thread.currentThread().getName() + "卖了一张票,还剩"+ number +"张票");
}
}
}
public class SaleTicket {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(() -> {
for (int i = 0;i < 40;i++){
ticket.sale();
}
},"售票员A").start();
new Thread(() -> {
for (int i = 0;i < 40;i++){
ticket.sale();
}
},"售票员B").start();
new Thread(() -> {
for (int i = 0;i < 40;i++){
ticket.sale();
}
},"售票员C").start();
}
}
2.Lock版
package com.xxx;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Ticket{
Lock lock = new ReentrantLock();
private int number = 30;
public void sale(){
try{
lock.lock();
if (number > 0){
number--;
System.out.println(Thread.currentThread().getName() + "卖了一张票,还剩"+ number +"张票");
}
}finally {
lock.unlock();
}
}
}
public class SaleTicket {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(() -> {
for (int i = 0;i < 40;i++){
ticket.sale();
}
},"售票员A").start();
new Thread(() -> {
for (int i = 0;i < 40;i++){
ticket.sale();
}
},"售票员B").start();
new Thread(() -> {
for (int i = 0;i < 40;i++){
ticket.sale();
}
},"售票员C").start();
}
}