关于一个多线程DEMO,Interrupt后是否会再次发生死锁

明月镇魂 2018-05-18 01:44:04
该多线程DEMO如下,
package cn.haiyisoft18;

public class ThreadStopDemo {

public static void main(String[] args) {
// TODO Auto-generated method stub
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
for (int i = 1; i <= 50; i++) {
if (i == 40) {
t1.interrupt();
t2.interrupt();
st.changeFlag();
}

System.out.println("MAIN----" + i);
}

System.out.println("MAIN------" + "OVER");

}

}

class StopThread implements Runnable {
private boolean flag = true;

@Override
public synchronized void run() {
// TODO Auto-generated method stub
while (flag) {
try {

wait();

} catch (InterruptedException ie) {
// TODO: handle exception
System.out.println(Thread.currentThread().getName() + "-----" + ie.toString());
}

System.out.println(Thread.currentThread().getName() + "------" + "hello");
}
}

public void changeFlag() {
this.flag = false;
}

}


问题在于主线程中的
for (int i = 1; i <= 50; i++) {
if (i == 40) {
t1.interrupt();
t2.interrupt();
st.changeFlag();
}


这个代码段如果把t1 interrupt后,假如CPU立刻给它执行权,那么此时主线程尚未将flag置为false,这时t1执行完毕后判断flag为true,又进入阻塞,同理t2也可能这样,那么st.changeFlag()是不是就没什么意义了?但是我昨晚试了很多遍都是一个三个线程顺利结束,无法出现t1或t2等待的状态,请问我考虑的情况到底会发生么?
...全文
753 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
闫兆昌 2018-05-24
  • 打赏
  • 举报
回复
package Arithmetic;

public class ThreadStopDemo
{

public static Object locka = new Object();
public static Object lockb = new Object();

public static void main(String[] args)
{


StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
}

}

class StopThread implements Runnable
{
@Override
public void run()
{
while (true)
{
synchronized(ThreadStopDemo.locka)
{
System.out.println(Thread.currentThread().getName()+" locka");
synchronized (ThreadStopDemo.lockb)
{
System.out.println(Thread.currentThread().getName()+" lockb");
}
}
synchronized(ThreadStopDemo.lockb)
{
System.out.println(Thread.currentThread().getName()+" lockb");
synchronized (ThreadStopDemo.locka)
{
System.out.println(Thread.currentThread().getName()+" locka");
}
}
}
}

}
给你看看这个,死锁的话就是一般就是同步锁的嵌套,双方都需要对方的资源,但是自己还都不放手,

给你举个例子:就是两个人吃饭的有一双筷子,一个人占据着一个筷子吗,都需要对方的筷子,但是双反都不放手自己的筷子,
这个例子的话就是线程一进来的话,会先拿着locka锁,线程0还没有进来,又继续拿着lockb锁,线程0又没进来,线程一在继续拿locka锁,这时线程0进来了,拿到了lcoka锁,下一步线程0拿着locka锁,想要lockb锁,而线程一拿着lockb锁想要locka锁,
这就会造成死锁

dgqjava 2018-05-18
  • 打赏
  • 举报
回复
理论上会发生, 同时这个代码理论上存在问题, 应该将16行代码放到14行的前面执行, 多线程潜在的问题可能因为概率或者是不同底层实现的原因导致很难或者完全无法表现出来, 你这个代码就属于这种情况
dgqjava 2018-05-18
  • 打赏
  • 举报
回复
只需要在15行和16行之间加入一个sleep 很大概率上你就有希望看到你说的情况

62,628

社区成员

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

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