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();
}
}
这里两个线程分别操作两个不同的对象,为什么还会发生死锁现象? 展开
{
///共享资源
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();
}
}
这里两个线程分别操作两个不同的对象,为什么还会发生死锁现象? 展开
4个回答
展开全部
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");
}
这样就相互等待了,形成了死锁
对象里面的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();
} 这个资源是共享的 静态变量啊!!
展开全部
synchronized (xxx),里边的对象必须是同一个对象!!
更多追问追答
追问
想他这样是为了出现死锁现象吧?
追答
new Test(true),new Test(false).有两个对象,意味着有两个flag。flag就不共享了!除非把它设置成静态的变量。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼主问题解决了没,我也有同样的疑问,也是初学者
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你把静态变量理解成实例变量了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询