Prayer X 2019-07-19 11:28 采纳率: 0%
浏览 1854
已采纳

在循环中synchronized包裹循环体后为什么不会释放锁?

小白刚学到线程加锁,然后发现在while循环中只要整个循环体都被同步代码块包含的话就只要满足条件线程获得锁后不会释放锁,尝试了一下在同步代码块外随便加一个都可以释放锁,所以想问一下while循环中判断的时候为什么不会释放锁?
我的理解是Synochronized代码块结束之后,释放锁,执行while判断,双线程争夺锁。 可是不知道为什么直接就跳过了释放的过程。。。

public class TickerPoolTest {

    public static void main(String[] args) {
        Pool1 p = new Pool1();
        Saler1 s1 = new Saler1(1,p);
        Saler1 s2 = new Saler1(2,p);
        new Thread(s1).start();
        new Thread(s2).start();

    }

}
class Pool1{
    static int size = 20;
}
class Saler1 implements Runnable{
    private int num;
    private Pool1 pool;
    private int sale = 0;

    public Saler1(int num, Pool1 pool) {
        super();
        this.num = num;
        this.pool = pool;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public void run() {

            for(int i = 0;i<20;i++){
                synchronized(pool){
                pool.size--;
                System.out.println("出票员"+num +"卖出一张,余票"+ pool.size);
                if(pool.size == 0)
                    System.exit(0);
            }
                //这里是我后来加的,使用了一行空输出来达到释放锁的效果
                System.out.print("");
        }
    }

}



更新:
因为样本过小导致线程交替没显示,结帖

  • 写回答

3条回答 默认 最新

  • GvG1008 2019-07-19 14:17
    关注

    我的理解是:
    线程并发执行,是通过cpu时间片轮转执行的,当你时间片执行完,线程1还占用着锁,线程2就会等待不会执行,然后线程1继续执行下一个时间片;
    如果时间片执行完,线程1是没有占用锁,线程2才能执行;你在同步代码外面加了一句输出语句,只不过加大了时间片执行完线程是进行到同步代码块外的可能;
    你可以试试去掉那句输出,也可能另一个线程也执行得到。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 防火墙的混合模式配置
  • ¥15 Ubuntu不小心注销了要怎么恢复啊
  • ¥15 win10电脑安装完plcsim advanced4.0运行时为什么会提示找不到虚拟网卡
  • ¥15 安装powerbuilder10卡在安装程序正在运行这个页面 没有下一步任何指令
  • ¥15 关于mpi的问题:请问遇到这种情况需要怎么解决,出现这个问题后电脑不能进行mpi多核运行只能进行单核运行
  • ¥50 微信聊天记录备份到电脑提示成功了,但还是没同步到电脑微信
  • ¥15 python怎么在已有视频文件后添加新帧
  • ¥20 虚幻UE引擎如何让多个同一个蓝图的NPC执行一样的动画,
  • ¥15 fluent里模拟降膜反应的UDF编写
  • ¥15 MYSQL 多表拼接link