线程死锁问题的分析
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。
不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁.
说明:我们写程序时,要避免出现死锁。
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。
相关文章推荐
- DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁
- [转载]DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- [转载]DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁
- 一个线程死锁问题的分析
- 一个线程死锁问题的分析
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- 使用Java thread dump分析CPU高使用率和线程死锁问题
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- 多线程调用epoll_wait()的线程安全问题分析 http://blog.csdn.net/lmh12506/article/details/7836827
- Java线程同步实例 生产者 消费者问题分析
- 分析Java 死锁以及MemoryLeak问题
- 深入分析Java线程中断问题
- 在Linux上分析死锁问题的简单方法
- java线程安全问题原理性分析
- [置顶] 多线程编程之线程死锁问题
- [转载] DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系
- 多线程编程之线程死锁问题
- mysql死锁问题分析