package 同步代码块8;
//把多条语句操作共享数据的代码给锁起来,让任意时刻只能有一个线程执行即可
/*synchronized(任意对象) {
多条语句操作共享数据的代码
}*/
//synchronized(任意对象):就相当于给代码加锁了,任意对象就可以看成是一把锁
/*好处:解决了多线程的数据安全问题
弊端:当线程很多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的
运行效率*/
public class SellTickets implements Runnable {
private static int tickets = 100;
private Object obj = new Object();
private int x = 0;
@Override
public void run() {
while (true) {
if (x % 2 == 0) {
synchronized (SellTickets.class) {
if (tickets > 0) {
//设置出票时间
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
//每卖出一张票总票数减一
tickets--;
}
}
} else {
/*synchronized (obj) {
if (tickets > 0) {
//设置出票时间
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
//每卖出一张票总票数减一
tickets--;
}
}*/
//创建买票方法
sellTickets();
}
x++;
}
}
private static synchronized void sellTickets() {
// synchronized (obj) {
if (tickets > 0) {
//设置出票时间
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
//每卖出一张票总票数减一
tickets--;
}
// }
}
}
package 同步代码块8;
public class SellTickstsDemo {
public static void main(String[] args) {
SellTickets st = new SellTickets();
Thread t1 = new Thread(st,"窗口1");
Thread t2 = new Thread(st, "窗口2");
Thread t3 = new Thread(st, "窗口3");
t1.start();
t2.start();
t3.start();
}
}