一、实验内容
在实验中,编写多线程程序,以模拟两个或多个线程同时访问同一个变量的情况。若其中一个线程需要修改这个变量,需要对这种情况进行处理,以确保数据的一致性和正确性。通过使用关键字Synchronized修饰修改数据的方法来实现线程同步的目的。这样做是为了在任意时刻,只有一个线程可以进入此修饰的方法,以避免多个线程同时修改变量而导致数据错误的问题。实验编码实现一个简单的售票程序,通过多线程模拟多个售票窗口同时售票的场景。通过使用关键字Synchronized,确保了对售票过程的同步控制,在多线程环境下避免了数据不一致的问题。本次实验编写两个售票程序,程序一使用synchronized,程序二不使用,设计三个窗口共享同样的变量tickets。用于测试synchronized功能对比。
二、源程序
package demo;
class SellTickets implements Runnable{
private static int tickets = 50;
private static boolean loop = true;
public void sell() {
synchronized (this) {
if(tickets < 0) {
System.out.println("已售完");
loop = false;
return;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("窗口"+Thread.currentThread().getName()
+"售出一张票,剩余票数"+(tickets--));
}
}
public void run() {
while(loop) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sell();
}
}
}
package demo;
public class SellTicketsTest {
public static void main(String[] args) {
SellTickets sellTickets = new SellTickets();
new Thread(sellTickets).start();//第 1 个线程-窗口
new Thread(sellTickets).start();//第 2 个线程-窗口
new Thread(sellTickets).start();//第 3 个线程-窗口
}
}
package demo;
class SellTickets01 implements Runnable{
private static int tickets = 100;
public void run() {
while(true) {
if(tickets < 0) {
System.out.println("已售完");
break;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("窗口"+Thread.currentThread().getName()
+"售出一张票,剩余票数"+(tickets--));
}
}
}
package demo;
public class SellTicketsTest01 {
public static void main(String[] args) {
SellTickets01 sellTickets01 = new SellTickets01();
Thread thread1 = new Thread(sellTickets01);
Thread thread2 = new Thread(sellTickets01);
Thread thread3 = new Thread(sellTickets01);
thread1.start();
thread2.start();
thread3.start();
}
}