线程的死锁问题

alrainy1 2017-05-19 07:06:44

private static String s1 = "筷子左";
private static String s2 = "筷子右";
public static void main(String[] args) {
//线程1
new Thread() {
public void run() {
while(true) {
synchronized(s1) {
System.out.println(getName() + "...拿到" + s1 + "等待" + s2);
synchronized(s2) {
System.out.println(getName() + "...拿到" + s2 + "开吃");
}
}
}
}
}.start();
//线程2
new Thread() {
public void run() {
while(true) {
synchronized(s2) {
System.out.println(getName() + "...拿到" + s2 + "等待" + s1);
synchronized(s1) {
System.out.println(getName() + "...拿到" + s1 + "开吃");
}
}
}
}
}.start();
}


请问这个为什么会发生死锁啊,程序运行线程1到在第一个同步锁s1的时候,不是会一直运行完s1锁着的那一段程序才让出cpu么?如果是那样,这段时间内线程2不会运行,怎么会有机会拿到锁s2从而占用s2,让s1拿不到s2,从而发生死锁啊?
...全文
344 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
apple_of_eye 2017-05-31
  • 打赏
  • 举报
回复
可以让一个线程超时了就释放锁
WannaYoo 2017-05-23
  • 打赏
  • 举报
回复
线程1拿到了CPU的执行权,即拿到了左筷子,后等待有筷子,而此时线程二拿到CPU执行了,拿到了右筷子,等待左筷子,就这样你等我,我等你,就形成了死锁(CPU是不会一直被站着的)
galiniur0u 2017-05-23
  • 打赏
  • 举报
回复
楼主这程序肯定会死锁,这就相当于两个人,你拿了左筷子,我拿了右筷子。俩人都吃不上。楼主在线程的第一个输出语句中去掉没有锁住的s1和s2,就不会死锁了。
爱摸鱼de老邪 2017-05-19
  • 打赏
  • 举报
回复
占着S1这个临界资源,又不是占着CPU,CPU调度一般情况下是时间片轮转的

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧