第一种解决方案:使用同步代码块
将方法代码写在返回值为synchronized的方法中
public synchronized void xxx(){}中
class Windows extends Thread{
private static int ticket = 100;
@Override
public void run() {
sellTicket();
}
//重复执行
public synchronized void sellTicket() {
while(true){
if (ticket > 0) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "买票,票号为:" + ticket);
ticket--;
} else {
break;
}
}
}
}
public class WindowsTest {
public static void main(String[] args) {
Windows win = new Windows();
Thread thread1 = new Thread(win,"窗口一");
Thread thread2 = new Thread(win,"窗口二");
Thread thread3 = new Thread(win,"窗口三");
thread1.start();
thread2.start();
thread3.start();
}
}
第二种解决方案:使用lock同步锁
当同步方法为非静态方法时,同步锁为类名.class 当同步方法时静态的方法时,同步锁为字节码对象 例如 Object lock = new Object();
Lock需要手动的启动同步(lock()),同时结束同步也需要手动的实现(unlock())
/**
* @author Clark
* @create 2021-12-14 17:05
*/
public class WindowsTest2 {
public static void main(String[] args) {
Windows2 win = new Windows2();
new Thread(win,"一号窗口").start();
new Thread(win,"二号窗口").start();
new Thread(win,"三号窗口").start();
}
}
class Windows2 implements Runnable {
private static int ticket = 100;
private Lock lock = new ReentrantLock();
@Override
public void run() {
//重复执行
while (true) {
lock.lock();
if (ticket > 0) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticket = ticket - 1;
System.out.println(Thread.currentThread().getName() + "买票,余票为:" + ticket);
lock.unlock();
}else{
break;
}
}
}
}
第三种解决方案:同步方法
class Windows extends Thread{
private static int ticket = 100;
@Override
public void run() {
//重复执行
synchronized (this) {
while (true) {
if (ticket > 0) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticket--;
System.out.println(Thread.currentThread().getName() + "买票,票号为:" + ticket);
} else {
break;
}
}
}
}
}
public class WindowsTest {
public static void main(String[] args) {
Windows win = new Windows();
Thread thread1 = new Thread(win, "窗口一");
Thread thread2 = new Thread(win, "窗口二");
Thread thread3 = new Thread(win, "窗口三");
thread1.start();
thread2.start();
thread3.start();
}
}