public class TicketService {
ArrayList<String> list = new ArrayList<>() ;
//private Vector list = new Vector (); vector中方法 remove 和size 是有锁
public TicketService(){
list.add("01车0A号");
list.add("01车0B号");
list.add("01车0C号");
list.add("01车0D号");
list.add("01车0E号");
list.add("01车0F号");
list.add("02车0A号");
list.add("02车0B号");
list.add("02车0C号");
list.add("02车0D号");
list.add("02车0E号");
list.add("02车0F号");
}
public void sale () {
//this or all都可以
//public void synchronized sale () {
synchronized(list) {
if(list.size()>0) {
String number = list.remove(0);
System.out.println(number);
}else {
System.out.println("已经卖光了");
}
}
}
public boolean hasTicket() {
return list.size()>0;
}
}
/***
* 卖票:两个窗口同时卖票
* 出现了两个窗口卖出 ,票号相同的票
*原因:两个线程操作了同一个资源 共享数据list 这就会有线程问题
*Java 中提供了一种方式解决线程安全问题
* 同步代码块
*sychronized(同步监视器对象){
* 需要同步代码
*}
*同步监视器对象的要求
*1)同步监视器对象的类型 可以是任意的引用数据的类型
*2)使用共享数据的这个多线程要用了同一个监视器对象
*同步方法:
*sychronized() throw
*
*同步监视器对象放在方法上:
*非静态方法:this
*静态方法:当前类class
*也必须保证多个线程用同一个监视器对象 this也要是同一个
*依据:哪些代码执行过程中,不允许其它线程插入进来
*/
public class TestSale {
public static void main(String[] args) {
Window window1 = new Window("窗口一") ;
Window window2 = new Window("窗口二") ;
window1.start();
window2.start();
}
}
class Window extends Thread {
static TicketService ts = new TicketService() ;
//TicketService ts = new TicketService() ; 错误 因为tickerservice 是需要一个对象
public Window (String name) {
super(name);
}
// public synchronized void run 错误的原因是因为非静态方法是锁定的this 但是这个this 是windows1 windows2 是不同的对象
public void run () {
while(ts.hasTicket()) {
ts.sale();
}
}
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/2018112215124247.png?x-oss-process=image/watermark, type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1BZb3VMaW5nMTIzNDU2Nzg5,size_16,color_FFFFFF,t_70)