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时间片。其他线程可以执行除了被占有的锁以外的其他资源。