使用同步代码块、同步方法、同步锁的方式模拟卖票程序
时间: 2023-12-03 15:05:50 浏览: 51
以下是使用同步代码块、同步方法、同步锁的方式模拟卖票程序的示例代码:
1. 同步代码块:
```java
public class TicketSeller implements Runnable {
private int tickets = 100;
private Object lock = new Object(); // 定义锁对象
@Override
public void run() {
while (tickets > 0) {
synchronized (lock) { // 加锁
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了第" + tickets + "张票");
tickets--;
}
} // 释放锁
}
}
}
```
2. 同步方法:
```java
public class TicketSeller implements Runnable {
private int tickets = 100;
@Override
public synchronized void run() { // 加synchronized关键字声明同步方法
while (tickets > 0) {
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了第" + tickets + "张票");
tickets--;
}
}
}
}
```
3. 同步锁:
```java
public class TicketSeller implements Runnable {
private int tickets = 100;
private ReentrantLock lock = new ReentrantLock(); // 定义可重入锁
@Override
public void run() {
while (tickets > 0) {
try {
lock.lock(); // 加锁
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "卖出了第" + tickets + "张票");
tickets--;
}
} finally {
lock.unlock(); // 释放锁
}
}
}
}
```
以上三种方式都可以保证线程安全,避免多个线程同时卖出同一张票。其中,同步代码块和同步方法使用的是内置锁(也称为监视器锁),而同步锁使用的是可重入锁。具体选择哪种方式,可以根据实际情况进行考虑。