线程启动等待问题

小码要当程序猿 2015-02-03 05:04:54
今天在博客园的这篇文章里了解了一下多线程的死锁问题
然后我自己修改了一下程序,运行了一下,有个地方不理解,大家帮忙看一下。


修改后的java代码如下:
public class RunnableTest implements Runnable {

private int flag = 1;
private Object obj1 = new Object(), obj2 = new Object();

public void run() {
System.out.println("flag=" + flag);
if (flag == 1) {
synchronized (obj1) {
System.out.println("我已经锁定obj1,休息0.5秒后锁定obj2去!");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println("1");
}
}
}
if (flag == 0) {
synchronized (obj2) {
System.out.println("我已经锁定obj2,休息0.5秒后锁定obj1去!");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj1) {
System.out.println("0");
}
}
}
}

public static void main(String[] args) throws InterruptedException {
RunnableTest test = new RunnableTest();
Thread thread1 = new Thread(test);
Thread thread2 = new Thread(test);
System.out.println("线程开始喽!");
test.flag = 1;
thread1.start();
Thread.sleep(10);
test.flag = 0;
thread2.start();
}
}

上述代码运行如下(死锁了):


然后我如果吧代码中的第43行注释掉,运行结果如下(没死锁):


线程启动有时间等待吗?
...全文
146 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
普凡 2015-02-04
  • 打赏
  • 举报
回复
引用 1 楼 ticmy 的回复:
没看代码,回复之后一句:调用start后,线程未必立马就会运行,要等待调度的
+1
  • 打赏
  • 举报
回复
引用 1 楼 ticmy 的回复:
没看代码,回复之后一句:调用start后,线程未必立马就会运行,要等待调度的
好吧,我想太多了
龙四 2015-02-03
  • 打赏
  • 举报
回复
没看代码,回复之后一句:调用start后,线程未必立马就会运行,要等待调度的

62,614

社区成员

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

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