Java中同步线程不是应该先中断先继续吗,为什么我的没有?求大神指点

代码如下:
public class BuyTicketMain {

       public static void main(String args[ ]) {
          TicketHouse officer = new TicketHouse();
          Thread zhangfei,likui,wangwu;
          zhangfei = new Thread(officer); 
          zhangfei.setName("张飞");
          likui = new Thread(officer);  
          likui.setName("李逵");
          wangwu =new Thread(officer);
          wangwu.setName("王五");
          wangwu.start();
          zhangfei.start();
          likui.start();
       }

}
代码2:import java.util.Scanner;

public class TicketHouse implements Runnable {
int fiveAmount=2,tenAmount=0,twentyAmount=0,n=0;
public synchronized void run() {
/* if(Thread.currentThread().getName().equals("张飞")) {
saleTicket(20);
}
else if(Thread.currentThread().getName().equals("李逵")) {
saleTicket(5);
}*/
System.out.println(Thread.currentThread().getName()+"买票"+Thread.currentThread().getName()+"有多少钱?(输入金额,只能为5,20)");
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
saleTicket(n);
}
private synchronized void saleTicket(int money) {
if(money==5) { //如果使用该方法的线程传递的参数是5,就不用等待
fiveAmount=fiveAmount+1;
System.out.println( "给"+Thread.currentThread().getName()+"入场卷,"+
Thread.currentThread().getName()+"的钱正好");
}
else if(money==20) {

while(fiveAmount<3) {
try { System.out.println("\n"+Thread.currentThread().getName()+"靠边等...");
wait(); //如果使用该方法的线程传递的参数是20须等待
//Thread.sleep(1000);
System.out.println("\n"+Thread.currentThread().getName()+"继续买票");
}
catch(InterruptedException e){}
}
fiveAmount=fiveAmount-3;
twentyAmount=twentyAmount+1;
System.out.println("给"+Thread.currentThread().getName()+"入场卷,"+
Thread.currentThread().getName()+"给20,找赎15元");
}
notifyAll();
}
}
下图中张飞不应该在王五之后就可以买票吗?为什么要等李逵买了之后才能继续买票?求大神指点
图片说明

可能是线程优先级问题,王五线程启动后占据锁后,李逵线程可能先于张飞线程先执行了。多线程环境下线程的执行顺序可能跟代码中开启的顺序不一致。你可以打印下每个线程的执行时间看看。

亲,这个和释放线程锁有关,当synchronized 中有操作在进行的时候,其他线程是休眠状态,当当synchronized中没有进行操作的时候,休眠状态的线程
被激活,这里面线程的激活有好几种方法,他们之间有些差别,例如: 同时激活又有休眠的线程,让线程自由竞争,谁抢到了谁就有使用权,有的是按顺序激活,
你可以点进去看看底层代码,或者上网查一下,激活线程的几种方式。

测试了下你的代码,的确如此,分析原因如下:
第一个输入20的值的线程被挂起了,即张飞线程被挂起了,但是wait操作时会释放this锁,然后王五和张飞线程运行时,王五和李逵竞争this锁时,王五先获取this锁,然后李逵进入锁等待排队队列中。
王五线程运行完成时会唤醒了张飞,并释放了this锁,张飞线程从挂起状态转换为可运行状态的时间里,李逵先一步获取this锁,并完成执行。所以张飞成了最后一个完成的线程。
主要原因就是线程的状态转换的耗时,导致锁竞争处于劣势。所以这个程序中输入20而挂起的线程总是最后一个完成的。