您的位置:首页 > 其它

线程死锁问题的分析

2017-12-06 13:14 211 查看
1.死锁的理解:
  不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁.

  说明:我们写程序时,要避免出现死锁。

  StringBuffer s1 = new StringBuffer();
  StringBuffer s2 = new StringBuffer();
  new Thread(new Runnable(){
  @Override
  public void run() {
  synchronized (s1) {
  s1.append("a");
  s2.append("1");
  try {
  Thread.sleep(10);
  } catch (InterruptedException e) {
  e.printStackTrace();
  }
  synchronized (s2) {
  s1.append("b");
  s2.append("2");
  System.out.println(s1);
  System.out.println(s2);
  }
  }
  }
  }).start();

  new Thread(new Runnable(){
  @Override
  public void run() {
  synchronized (s2) {
  s1.append("c");
  s2.append("3");
  try {
  Thread.sleep(10);
  } catch (InterruptedException e) {
  e.printStackTrace();
  }
  synchronized (s1) {
  s1.append("d");
  s2.append("4");

  System.out.println(s1);
  System.out.println(s2);
  }
  }
  }
  }).start();    

二:释放锁的操作:

1- 当前线程的同步方法、同步代码块执行结束

2- 当前线程在同步代码块、同步方法中遇到break、return终止了该代码块、该方法的继续执行。

3- 当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束

4- 当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并释放锁。

三:不会释放锁的操

1- 线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行

2- 线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁(同步监视器)。
3- 应尽量避免使用suspend()和resume()来控制线程

四:互斥锁

1- 在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。
2- 每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
3- 关键字synchronized 来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
4- 同步的局限性:导致程序的执行效率要降低
5- 同步方法(非静态的)的锁为this。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: