同步监视器:俗称锁。①任何一个类的对象都可以充当锁。②多个线程共用同一把锁
共享数据:多个线程共同操作的数据,即为共享数据。如果数据为共享数据,在操作时需要使用同步机制将操作共享数据的代码包起来。不能包多,也不能包少。
典型例子:三个窗口售票
使用同步代码块
package day0427.text;
/**
* 例子:创建三个窗口售票,总共100张使用继承Thread类的方式
* 解决线程安全问题
* 说明:在继承Thread类创建多线程的方式中,慎用this充当同步监视器。可以考虑使用当前类充当同步监视器。
* @author lbqstart
* @create 2022-04-27-14:55
*/
public class WindowTest3 {
public static void main(String[] args) {
Window3 window1 = new Window3();
Window3 window2 = new Window3();
Window3 window3 = new Window3();
window1.setName("窗口一");
window2.setName("窗口二");
window3.setName("窗口三");
window1.start();
window2.start();
window3.start();
}
}
class Window3 extends Thread{
private static int ticket = 100;
private static Thread thread = new Thread();
@Override
public void run() {
while (true){
//正确的
//synchronized(thread) {
synchronized(Window3.class){//也是正确的,类也是对象,Window3.class只会加载一次
//错误的:this代表当前对象,因为在main()中创建了三个此对象,因此不唯一。
//synchronized(this){
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + ":卖票,票号为:" + ticket);
ticket--;
} else {
break;
}
}
}
}
}