JAVA多线程的资源共享和死锁问题。

classThreadTestimplementsRunnable{///共享资源publicvoidrun(){//对共享资源的处理}}MulThreadmt=newM... class ThreadTest implements Runnable
{
///共享资源
public void run() {
//对共享资源的处理
}

}
MulThread mt=new MulThread();
ThreadTest t=new ThreadTest();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
t1.start();
t2.start();
t3.start();
以上是一个多线程资源共享的举例,我的理解是只实例化一个runnable的子类对象(t),然后多个线程去操作这个对象t,就实现了资源共享。

下面是一个死锁的举例:

public class Test implements Runnable {
boolean flag;
public Test(boolean flag) {
this.flag = flag;
}
public void run() {
if (flag) {
synchronized (Lock.lock1) {
System.out.println("if-lock1");
synchronized (Lock.lock2) {
System.out.println("if-lock2");
}
}
} else {
synchronized (Lock.lock2) {
System.out.println("else-lock2");
synchronized (Lock.lock1) {
System.out.println("else-lock1");
}
}
}
}
}
class Lock {
public static Object lock1 = new Object(); //自己定义两个锁,供同步块使用
public static Object lock2 = new Object();
}
class MainDemo {
public static void main(String[] args) {
Thread thread1 = new Thread(new Test(true));
Thread thread2=new Thread(new Test(false));

thread1.start();
thread2.start();
}
}
这里两个线程分别操作两个不同的对象,为什么还会发生死锁现象?
展开
 我来答
zq3062211015
2013-08-15 · TA获得超过125个赞
知道答主
回答量:80
采纳率:0%
帮助的人:41.1万
展开全部
Thread thread1 = new Thread(new Test(true));

对象里面的flag 为 true;会获得Lock.lock1
的锁,
Thread thread2 = new Thread(new Test(false));

对象里面的flag 为 false;会获得Lock.lock2
的锁,
然后thread1 又想获得Lock.lock2,
代码为:
synchronized (Lock.lock2) {
System.out.println("if-lock2");
}

然后thread2 又想获得Lock.lock1,
代码为:synchronized (Lock.lock1) {
System.out.println("else-lock1");
}
这样就相互等待了,形成了死锁
更多追问追答
追问
我的疑问是这里两个线程中分别是new Test(true),new Test(false),这样还是资源共享的吗?不是每个线程分别操作不同的资源?
追答
但是他们用的都是 class Lock {
public static Object lock1 = new Object(); //自己定义两个锁,供同步块使用
public static Object lock2 = new Object();
} 这个资源是共享的 静态变量啊!!
阿呆的短剧
2013-08-15 · TA获得超过606个赞
知道小有建树答主
回答量:359
采纳率:50%
帮助的人:249万
展开全部
synchronized (xxx),里边的对象必须是同一个对象!!
更多追问追答
追问
想他这样是为了出现死锁现象吧?
追答
new Test(true),new Test(false).有两个对象,意味着有两个flag。flag就不共享了!除非把它设置成静态的变量。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dougoudemao
2019-07-11
知道答主
回答量:1
采纳率:0%
帮助的人:730
展开全部
楼主问题解决了没,我也有同样的疑问,也是初学者
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友f296ad8
2013-08-15 · TA获得超过142个赞
知道小有建树答主
回答量:347
采纳率:0%
帮助的人:150万
展开全部
你把静态变量理解成实例变量了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式