62,614
社区成员
发帖
与我相关
我的任务
分享
while (true) {
synchronized (this) {
if (tickets > 0) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + " is selling ticket"
+ tickets--);
}
}
try {
Thread.sleep(10);
} catch (Exception e) {
}
while (true) {
synchronized (this) { // 竞争锁,获得以后,加锁,进入同步块
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName()
+ " is selling ticket" + tickets--);
}
} // 结束同步块,释放锁,让其他线程又机会获得锁(线程1的同步块执行结束,其他线程都去竞争锁)
}
我同意sleep和锁没啥 关系,但是同步块是放在while下面的,所以,下一次while的时候,其他线程就有机会去竞争锁!
所以理论上是不会只有1个线程输出结果的,但是为什么在i7机器(或者调小sleep的时间)会很高的概率出现只有1个线程输出结果,这个我同意4楼,java一定有什么自己争夺锁的内部逻辑吧。