题目1请编写程序不使用任何同步技术模拟三个窗口同时卖100张票的情况运行并打印结果观察到错误的数据并解释出现错误的原因。题目2请使用同步代码块改写题目一的程序保证运行结果的正确。使用同步代码块解决代码:题目3请使用同步方法改写题目一的程序保证运行结果的正确。使用同步方法代码如下:题目4请使用Lock锁改写题目一的程序保证运行结果的正确使用如下:题目51 某公司组织年会会议入场时有两个入口 在入场时
题目1
public class TicketSale implements Runnable {
private int tickets = 100;
@Override
public void run() {
while (tickets > 0) {
try {
Thread.sleep(100); // 模拟其他操作耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖出了第" + tickets-- + "张票");
}
}
public static void main(String[] args) {
TicketSale ticketSale = new TicketSale();
new Thread(ticketSale, "窗口1").start();
new Thread(ticketSale, "窗口2").start();
new Thread(ticketSale, "窗口3").start();
}
}
运行结果:
窗口1卖出了第100张票
窗口1卖出了第98张票
窗口2卖出了第99张票
窗口1卖出了第97张票
窗口3卖出了第96张票
...
出现错误的原因是多个线程同时操作 tickets 变量,导致数据错误。
题目2
public class TicketSale implements Runnable {
private int tickets = 100;
private final Object lock = new Object();
@Override
public void run() {
while (true) {
synchronized (lock) {
if (tickets > 0) {
try {
Thread.sleep(100); // 模拟其他操作耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖出了第" + tickets-- + "张票");
} else {
break;
}
}
}
}
public static void main(String[] args) {
TicketSale ticketSale = new TicketSale();
new Thread(ticketSale, "窗口1").start();
new Thread(ticketSale, "窗口2").start();
new Thread(ticketSale, "窗口3").start();
}
}
题目3
public class TicketSale implements Runnable {
private int tickets = 100;
@Override
public synchronized void run() {
while (tickets > 0) {
try {
Thread.sleep(100); // 模拟其他操作耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖出了第" + tickets-- + "张票");
}
}
public static void main(String[] args) {
TicketSale ticketSale = new TicketSale();
new Thread(ticketSale, "窗口1").start();
new Thread(ticketSale, "窗口2").start();
new Thread(ticketSale, "窗口3").start();
}
}
题目4
public class TicketSale implements Runnable {
private int tickets = 100;
private final Lock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
lock.lock();
try {
if (tickets > 0) {
try {
Thread.sleep(100); // 模拟其他操作耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖出了第" + tickets-- + "张票");
} else {
break;
}
} finally {
lock.unlock();
}
}
}
public static void main(String[] args) {
TicketSale ticketSale = new TicketSale();
new Thread(ticketSale, "窗口1").start();
new Thread(ticketSale, "窗口2").start();
new Thread(ticketSale, "窗口3").start();
}
}
题目5
public class Entrance implements Runnable {
private static final int TOTAL_EMPLOYEES = 100;
private static final int FRONT_DOOR_EMPLOYEES = 87;
private static final int BACK_DOOR_EMPLOYEES = 13;
private static final Object lock = new Object();
private static int frontDoorCount = 0;
private static int backDoorCount = 0;
private final int id;
public Entrance(int id) {
this.id = id;
}
@Override
public void run() {
for (int i = 0; i < TOTAL_EMPLOYEES; i++) {
String lottery = DoubleColorBallUtil.create();
synchronized (lock) {
if (id == 1) {
System.out.printf("%d 编号为: %d 的员工 从后门 入场! 拿到的双色球彩票号码是:%s%n", i + 1, Thread.currentThread().getId(), lottery);
backDoorCount++;
} else {
System.out.printf("%d 编号为: %d 的员工 从前门 入场! 拿到的双色球彩票号码是:%s%n", i + 1, Thread.currentThread().getId(), lottery);
frontDoorCount++;
}
}
}
}
public static void main(String[] args) {
new Thread(new Entrance(1), "后门").start();
new Thread(new Entrance(2), "前门").start();
try {
Thread.sleep(1000); // 等待两个线程执行完毕
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("从后门入场的员工总共: %d 位员工%n", backDoorCount);
System.out.printf("从前门入场的员工总共: %d 位员工%n", frontDoorCount);
}
}
``
原文地址: https://www.cveoy.top/t/topic/fqoF 著作权归作者所有。请勿转载和采集!