package deep;标签:同步,Thread,安全,线程,解决,new,ticket,多线程 From: https://www.cnblogs.com/liujy2233/p/16883909.html
//问题:出现重票和错票(即线程安全问题)
//原因:某个线程操作车票的过程中,未完成时其它线程就参与进来,也操作
//如何解决:a操作完才允许其它线程加入
//在java中通过同步机制
/*一、同步代码块
synchornized(同步监视器){
需要被同步的代码(操作共享数据的代码)
}
1.共享数据为多个线程共同操作的变量 如ticket
2.同步监视器:俗称锁,任何一个类的对象
要求:多个线程必须共用同一把锁
补充:在实现Runnable接口创建多线程,可以考虑用this来充当同步监视器
在继承Thread类创建多线程时,最好不用this,可以考虑使用当前类充当监视器
*/
class Window1 implements Runnable {
private int ticket = 100;
private static Object obj = new Object();
//线程里跑的东西
public void run() {
while (true) {
synchronized (obj) { //也可以使用Window.class 类可以作为一个对象出现
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":卖票:票号为:" + ticket);
ticket--;
} else {
break;
}
}
}
}
}
public class WindowTest1 {
public static void main(String[] args) {
Window1 w = new Window1(); //创建一个对象
Thread t1 = new Thread(w); //三个构造器使用同一个对象
Thread t2 = new Thread(w);
Thread t3 = new Thread(w);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}