关于Thread.sleep()方法

sleep()方法不释放锁,但释放cpu;
如果有多个线程同时操作一个锁里资源,如果某个线程占有了锁,但在执行方法的时候执行了sleep()方法。其他线程只有在该线程睡醒了,并执行完方法,释放锁之后,才可以和该线程再次争夺锁资源。
一个卖票示例:
class MyThread2 implements Runnable {

private int TICKET = 5;

@Override
public void run() {
    while (true) {
        synchronized (this) {
            if (this.TICKET > 0) {
            //得到当前线程名字
            System.out.print(Thread.currentThread().getName());
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println( "卖票:票数剩余:" + (--TICKET));
            } else {
                System.out.println("票已经卖完");
                break;
            }
        }
    }
}

}
执行结果:
售票员A卖票:票数剩余:4
售票员A卖票:票数剩余:3
售票员C卖票:票数剩余:2
售票员C卖票:票数剩余:1
售票员C卖票:票数剩余:0
票已经卖完
票已经卖完
票已经卖完
当线程A占有锁后,售票员A发现手中有票(票数>0),即使它睡了100ms,它也总是成功把票卖出去了。而不是在它休眠期间,锁被其他线程抢走,票没卖出去。只有在执行完if语句,走出synchronized(){}方法体后,才会与其他资源再次抢夺锁资源。
这里再解释一下为什么要用while(true){}结构包起来,因为每个线程的Thread.start()只会执行一次run()方法。一旦出去,就进不来了,造成的结果是每个线程只能卖一张票。
sleep()方法会释放cup资源,仅仅只是抱着锁,而不是cpu时间片。其他线程可以执行除了被占有的锁以外的其他资源。

发布了14 篇原创文章 · 获赞 0 · 访问量 334

猜你喜欢

转载自blog.csdn.net/qq_38205881/article/details/103548904