为什么while判断如果在synchronized里面

img

 public class ThreadDemo4t
    no usages
    public static void main(StringL]args) 
        yyRunnabLe5mr=new MyRunnable5C
        Threadt=newThread(mr,name:"一号选手")
        Threadt1=newThread(mr,name:"二号选手")
        t1.start()
        t.startO);
 2usages
 cLass MyRunnable5implements Runnable
    4usages
    orivateintticket=10
    QOverride
    public void runC) T
          while(ticket>0)
            BuyO);
    1 usage
    public void BuyC)
          while(ticket>0)
        synchronized(this)
            while(ticket>){
            if(ticket>)
                System.out.printin(Thread.currentThreadC).getNameC)+"买到了第"+ticket+"张票");
                ticket--
            try
                Thread.sLeepC millis: 1000)
            catch(InterruptedExceptione)
                thrownewRuntimeException(e)

为什么while判断如果在synchronized里面,第二个线程就不运行,放在外面,就可以运行,求解

你用笨理想啊
假如有很多个人在处理快递,但是仓库一次只能允许一个人进入
那你是先告诉所有人循环执行任务,轮到谁去拿快递,谁就把门锁好,等他出来下一个人再进
还是一个人先进去把门锁上,然后他自己一直在不停的拿快递
结果能一样吗

"如果在synchronized里面,第二个线程就不运行" -- 因为它被阻塞了。在 synchronized 块内部只有一个线程能够被执行。即使有多个线程同时运行到了 synchronized 块,也只有一个线程能够进入块并占有锁(即在此期间不能被其他线程占用)。因此,当第一个线程进入块并占有锁时,第二个线程会被阻塞,直到第一个线程执行完 synchronized 块并释放锁为止。

另外需要注意,变量 ticket 是多个线程共享的,因此在访问时应该使用同步措施来保证线程安全。否则,可能会出现不同线程之间的竞争条件,导致程序出现异常或者结果不正确。

同步代码块 synchronized,如果 是 A线程先获取锁,那就要等 A执行完,其他的线程 才能占有锁,并继续执行;

  • while 在synchronized里面,第一个占有锁的线程,要等while执行完了,才释放锁; 其他线程当然是不会执行的;
  • while 在synchronized外面,第一个占有锁的线程,等一轮循环完 就释放锁,其他线程就有机会抢占锁,从执行相关代码