模拟购票(Thread):
public class Test3 extends Thread {
private int ticket = 10;//模拟火车票数
public void run(){
for(int i =0;i<10;i++){
synchronized (this){//一个线程访问一个对象中的synchronized(this)同步代码块时,其他试图访问该对象的线程将被阻塞。
if(this.ticket>0){
try {
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"窗口卖票---->"+(this.ticket--));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] arg){
Test3 t1 = new Test3();
new Thread(t1,"线程1").start();//模拟卖票窗口
new Thread(t1,"线程2").start();
}
}
输出结果(Thread):
线程1窗口卖票---->10
线程1窗口卖票---->9
线程1窗口卖票---->8
线程1窗口卖票---->7
线程2窗口卖票---->6
线程2窗口卖票---->5
线程1窗口卖票---->4
线程1窗口卖票---->3
线程1窗口卖票---->2
线程1窗口卖票---->1
Process finished with exit code 0
模拟购票(Runnable):
public class Test02 implements Runnable{
private int ticket = 10;
public void run(){
for(int i =0;i<10;i++){
synchronized (this){
if(this.ticket>0){
try {
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"窗口卖票---->"+(this.ticket--));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
Test02 mt=new Test02();
new Thread(mt,"线程1").start();
new Thread(mt,"线程2").start();
}
}
输出结果(Runnable):
线程1窗口卖票---->10
线程1窗口卖票---->9
线程1窗口卖票---->8
线程1窗口卖票---->7
线程1窗口卖票---->6
线程2窗口卖票---->5
线程2窗口卖票---->4
线程1窗口卖票---->3
线程1窗口卖票---->2
线程1窗口卖票---->1
Process finished with exit code 0
问题:为什么要加synchronized关键字
答:(因为是多线程同时访问一个变量会有同步问题,加上锁才是最终正确的代码)