BuyTicketThread线程类代码如下所示:
package com.test.test02; public class BuyTicketThread extends Thread{ static Object o = new Object();//如何确定为一把锁,用static修饰,用static修饰的在内存中是独一份 final String a = "abc"; //这块a变量加final修饰就不能做更改了 public BuyTicketThread(String name) { super(name); } //一共10张票 怎么让这10张票共享? static int ticketNum = 10; //多个对象共享10张票 //int ticketNum = 10; //每个窗口都是一个线程对象:每个对象执行的代码放入run方法中 @Override public void run() { //每个窗口后面有100个人在抢票 for(int i=1;i<=100;i++) { //synchronized (this) { //synchronized ("abc") { //synchronized (BuyTicketThread.class) { //synchronized (o) { //用Object对象o作为锁上面的写法是不同的锁,有t1,t2,t3三个对象,对应的o也是不同的锁,对应的o有3个,也是3个锁,加上static就是同一把锁了。 synchronized (a) { //上面的字符串abc在内存中是独一份,也是好使的 //a = "def"; if (ticketNum > 0) {//对票数进行判断,票数大于零我们才抢票 System.out.println("我在" + this.getName() + "买到了从北京到哈尔滨的第" + ticketNum-- + "张车票"); } } } } public void a() { //两个方法都将o锁住了 synchronized(o) { //这个o被释放了下面的o才能执行 } } public void c() { synchronized(a) { //上面的o被锁住了但是a还能正常执行 } } public void b() { synchronized(o) { } } }
线程测试Test类如下所示:
package com.test.test02; import com.test.test01.TestThread; public class Test { public static void main(String[] args) { //多个窗口抢票:三个窗口三个线程对象 BuyTicketThread t1 = new BuyTicketThread("窗口1"); t1.start(); BuyTicketThread t2 = new BuyTicketThread("窗口2"); t2.start(); BuyTicketThread t3 = new BuyTicketThread("窗口3"); t3.start(); } /* //多运行几次就出现了同时买到第9张车票情况,如下所示: 我在窗口1买到了从北京到哈尔滨的第9张车票 我在窗口3买到了从北京到哈尔滨的第10张车票 我在窗口2买到了从北京到哈尔滨的第9张车票 我在窗口3买到了从北京到哈尔滨的第7张车票 我在窗口1买到了从北京到哈尔滨的第8张车票 我在窗口3买到了从北京到哈尔滨的第5张车票 我在窗口2买到了从北京到哈尔滨的第6张车票 我在窗口3买到了从北京到哈尔滨的第3张车票 我在窗口1买到了从北京到哈尔滨的第4张车票 我在窗口3买到了从北京到哈尔滨的第1张车票 我在窗口2买到了从北京到哈尔滨的第2张车票 //加了synchronized (this)还有问题 我在窗口2买到了从北京到哈尔滨的第10张车票 我在窗口3买到了从北京到哈尔滨的第9张车票 我在窗口1买到了从北京到哈尔滨的第10张车票 我在窗口3买到了从北京到哈尔滨的第7张车票 我在窗口2买到了从北京到哈尔滨的第8张车票 我在窗口3买到了从北京到哈尔滨的第5张车票 我在窗口1买到了从北京到哈尔滨的第6张车票 我在窗口3买到了从北京到哈尔滨的第3张车票 我在窗口2买到了从北京到哈尔滨的第4张车票 我在窗口3买到了从北京到哈尔滨的第1张车票 我在窗口1买到了从北京到哈尔滨的第2张车票 //加了synchronized ("abc")后没有问题了 我在窗口1买到了从北京到哈尔滨的第10张车票 我在窗口1买到了从北京到哈尔滨的第9张车票 我在窗口2买到了从北京到哈尔滨的第8张车票 我在窗口2买到了从北京到哈尔滨的第7张车票 我在窗口2买到了从北京到哈尔滨的第6张车票 我在窗口2买到了从北京到哈尔滨的第5张车票 我在窗口2买到了从北京到哈尔滨的第4张车票 我在窗口2买到了从北京到哈尔滨的第3张车票 我在窗口2买到了从北京到哈尔滨的第2张车票 我在窗口2买到了从北京到哈尔滨的第1张车票 //加了synchronized (BuyTicketThread.class)后也没有问题了 我在窗口1买到了从北京到哈尔滨的第10张车票 我在窗口1买到了从北京到哈尔滨的第9张车票 我在窗口1买到了从北京到哈尔滨的第8张车票 我在窗口3买到了从北京到哈尔滨的第7张车票 我在窗口3买到了从北京到哈尔滨的第6张车票 我在窗口3买到了从北京到哈尔滨的第5张车票 我在窗口3买到了从北京到哈尔滨的第4张车票 我在窗口3买到了从北京到哈尔滨的第3张车票 我在窗口3买到了从北京到哈尔滨的第2张车票 我在窗口3买到了从北京到哈尔滨的第1张车票 * * * */ }