首页 新闻 会员 周边

java程序死锁

0
[已解决问题] 解决于 2017-04-19 23:56

package com.itheima.test04;

import java.util.Random;

public class TestSynchronized implements Runnable{
//为什么只有静态的锁才能锁住程序?
  public static Object A = new Object();
  private static Object B = new Object();
  private int i = new Random().nextInt(1);

  @Override
  public void run() {
    while(true){
      if(i % 2 == 0){
        synchronized (A) {
          System.out.println(i);
          System.out.println("Lock-A");
          synchronized (B) {
            System.out.println("Lock-B");
          }
        }
      } else {
        synchronized (B) {
          System.out.println(i);
          System.out.println("Lock--B");
          synchronized (A) {
            System.out.println("Lock--A");
          }
        }
      }
      i++;
    }
  }

}

刚反面的主页 刚反面 | 菜鸟二级 | 园豆:209
提问于:2017-04-04 21:08
< >
分享
最佳答案
0

你把对象放外面呢?你是想测试死锁吧。非static自己线程用自己锁。你这个锁没用啊

奖励园豆:5
Nikola.Tesla | 菜鸟二级 |园豆:207 | 2017-04-04 23:46
其他回答(3)
0

m没看代码.回答问题:因为静态是同一个..锁的目标不是同一个.自然就不是同一个锁

吴瑞祥 | 园豆:29449 (高人七级) | 2017-04-04 23:16
0

//为什么只有静态的锁才能锁住程序?貌似这种说法不科学吧

全力以赴001 | 园豆:629 (小虾三级) | 2017-04-05 10:15
0

这个要看你调用情况,这个也同c#的lock一样

1.为什么出现死锁,如果两个线程在跑run,一个进入是上面一块,一个进入下面块就死锁了。第一个要B时,下面在用,他只能等,但是下面要等A所以互相等待。

2.为什么用静态的,如果不用静态的怕出现这种情况 new TestSynchronized().run() 这种方式就永远没有锁的效果。因为每个对象都是独立的,但是如果是静态的就不会了,就有效果。

gw2010 | 园豆:1487 (小虾三级) | 2017-04-06 16:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册