解决方案 »
- 求struts1封装formbean的思路
- java调节windows音量大小
- PrintWriter.close()不调用会泄露资源吗?
- GUI面板滚动条不能出现
- final,finally,finalizer的区别?
- JPanel相关问题编译出错,大家看看
- windows 2003 的问题
- 请教一个关于char[]的问题
- 用java.lang.Runtime.getRuntime().exec() 执行sybase BCP出现的问题(UNIX系统下出现)
- 求高手指点!!
- 如何重现java.net.SocketException: Broken Pipe
- myelipse 导出的jar双击可以运行,但是里面的按钮不执行相应的方法
所以说代码改为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) {
}
sleep执行结束后,四个线程竞争同步锁,自己获取的几率大。
你的这个说法是错误的。sleep不会释放锁,所以不存在你说的竞争的问题,该线程将会一直持有锁,直到释放锁为止。
sleep执行结束后,四个线程竞争同步锁,自己获取的几率大。
你的这个说法是错误的。sleep不会释放锁,所以不存在你说的竞争的问题,该线程将会一直持有锁,直到释放锁为止。结果不一定是只有一个线程被执行,也许是2个,也可能是3个。
在我自己的i7机器上运行,只有1个线程打出结果了,但在同学的i3机器上跑了下,就会出现2,3个线程打出结果的情况。
还发现,如果更改Thread.sleep(1)的话,即使是i3的机器也只有1个线程打印出结果。这个是什么原因呢?
sleep执行结束后,四个线程竞争同步锁,自己获取的几率大。
你的这个说法是错误的。sleep不会释放锁,所以不存在你说的竞争的问题,该线程将会一直持有锁,直到释放锁为止。
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一定有什么自己争夺锁的内部逻辑吧。
sleep执行结束后,四个线程竞争同步锁,自己获取的几率大。
你的这个说法是错误的。sleep不会释放锁,所以不存在你说的竞争的问题,该线程将会一直持有锁,直到释放锁为止。while循环的间隙会去竞争锁吧?
sleep执行结束后,四个线程竞争同步锁,自己获取的几率大。
你的这个说法是错误的。sleep不会释放锁,所以不存在你说的竞争的问题,该线程将会一直持有锁,直到释放锁为止。while循环的间隙会去竞争锁吧?不好意思,你说的对,我没有注意到他把锁放在while循环内部了。
你可以吧ticket重置多点 或者多运行几遍
sleep执行结束后,四个线程竞争同步锁,自己获取的几率大。
你的这个说法是错误的。sleep不会释放锁,所以不存在你说的竞争的问题,该线程将会一直持有锁,直到释放锁为止。结果不一定是只有一个线程被执行,也许是2个,也可能是3个。
在我自己的i7机器上运行,只有1个线程打出结果了,但在同学的i3机器上跑了下,就会出现2,3个线程打出结果的情况。
还发现,如果更改Thread.sleep(1)的话,即使是i3的机器也只有1个线程打印出结果。这个是什么原因呢?可能是休眠时间问题,