需求:模拟三个窗口同时买票。
问题1:static 修饰num,只创建一份在内存中,要不就会创建3份。
问题2:线程安全问题。(代码重1的红色字体)
出现的原因:存在两个或两个以上的线程对象,而且线程间共享着一个资源,
有多个语句操作了共享资源。
解决方式:加个锁,synchronized,把锁放到出现线程安全问题的地方,当多个线程一起
来访问时(线程1,线程2,线程3),看谁先强到锁,先抢到的“人”,拿到锁,
然后把门“锁上”,就执行它自己的,而其余的线程就在“门外”等,直到它出来了,
这时锁的状态就变成“开”,然后他们三个再继续一起“抢”,循环这一过程。
注意:公共的锁有且只有一把,多了就不能解决问题了。
那么么既然锁这么好用我们是不都要在自己代码中加个“锁”呢?
答:不是的,没有必要的时候是不用加的,否则会降低效率,如:判断锁的“开”和“关“,那也是要消耗时间的。
import java.util.Scanner; public class EX10 { public static void main(String[] args) { SaleTicket t1 = new SaleTicket("chongkuo 1"); SaleTicket t2 = new SaleTicket("chongkuo 2"); SaleTicket t3 = new SaleTicket("chongkuo 3"); t1.start(); t2.start(); t3.start(); } } class SaleTicket extends Thread{ static int num = 50; static Object o = new Object(); public SaleTicket(String name){ super(name); } @Override public void run() { while(true) { synchronized ("锁"){ if(num > 0){ System.out.println(Thread.currentThread().getName() + "售出了第-------- " + num + "号票"); try{ Thread.sleep(100); }catch (InterruptedException e){ e.printStackTrace(); } num--; }else{ System.out.println("卖完了"); break; } } } } }
时间: 2024-10-12 03:02:24