qq_33093791 2020-12-26 16:56 采纳率: 0%
浏览 2

关于java多线程请问为什么会有这个结果?

package javathread;


public class ticketsell implements Runnable{
    private volatile int  tickets=30;
    Object lock =new Object();
    @Override
    public void run() {

        while(tickets>0){
            synchronized (lock){
                System.out.println(Thread.currentThread().getName() + "终于卖了第" + tickets + "张票/n");
                tickets--;
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
           }
        }
    }


}
package javathread;

public class testticketsell {
    public static void main(String[] args) {
        ticketsell t=new ticketsell();
        Thread t1=new Thread(t,"t1");
        Thread t2=new Thread(t,"t2");
        Thread t3=new Thread(t,"t3");
        t2.start();
        t1.start();
        t3.start();
    }
}

运行结果:

1.为什么会出现0和-1呢?我觉得应该与while的判断条件在synchronized代码块外有关,可以解释下底层原因吗?

2.每次运行结果都是如此,不应该是随机出现吗?怎么前面一直是线程2抢到?

  • 写回答

2条回答 默认 最新

  • MrBUS 2020-12-26 21:06
    关注

    1.因为while在synchronized外面,线程3和1是在while后synchronized前等待

    2.因为线程2还未结束,所以一直都是2抢到

    3.我在瞎说

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog