多线程死锁问题(this锁和普通锁区别)
2013-10-19 11:24
134 查看
需求:写一个多线程死锁程序。思路:1、创建一个类Test 实现Runnable接口,并把任务封装到run()方法中。2、任务代码中用到两个同步代码块,并实现任务切换,来实现死锁。3,或者用同步函数和同步代码块,但能发现this锁的特殊。
第一种方法是,用两个同步代码块嵌套,来实现死锁。
package cm; public class DeadLock { public static void main(String []args){ Test t=new Test(); Thread s=new Thread(t,"one"); Thread s1=new Thread(t,"two"); s.start(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t.flag=false; s1.start(); } } class Test implements Runnable{ boolean flag=true; Object obj =new Object(); Object obj1 =new Object(); public void run() { if(flag) { while(true) { synchronized(obj){ System.out.println(Thread.currentThread()+"...lock obj....."); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } synchronized(obj1){ System.out.println(Thread.currentThread()+".....lock obj1....."); } } } } else while(true) show(); } private void show() { synchronized(obj1){ System.out.println(Thread.currentThread()+"obj1 lock...."); synchronized(obj){ System.out.println(Thread.currentThread()+"obj lock....."); } } } }
第二种死锁方式:
同步函数和同步代码块嵌套,可以发现的不同之处是。this锁由于是指向本类对象,故可以被同一个对象调用的同步函数同时持有
,而不排斥,普通锁只能被一个所持有,也就是说,s线程拿到了this锁同时,不影响s1线程拿到this锁。。package cm;public class DeadLock {public static void main(String []args){Test t=new Test();Thread s=new Thread(t,"one");Thread s1=new Thread(t,"two");s.start();try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}t.flag=false;s1.start();}}class Test implements Runnable{boolean flag=true;Object obj =new Object();public void run() {if(flag){while(true){synchronized(obj){System.out.println(Thread.currentThread()+"...lock obj.....");try {Thread.sleep(10);}catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}show();}}}elsewhile(true)show();}private void show() {System.out.println(Thread.currentThread()+"this lock....");synchronized(obj){System.out.println(Thread.currentThread()+"obj lock.....");}}}
相关文章推荐
- 19-多线程(验证同步函数的锁) 21-多线程(单例模式涉及的多线程问题) 1 2 22-多线程(死锁示例) 23-Objcet放的位置产生的问题
- 【JAVA多线程问题之死锁】
- 【java】多线程中Thread.currentThread().getName()和this.getName()的区别
- Java多线程——安全与死锁问题
- day11多线程,run方法。卖票多线程示例。synchronized,同步锁对象,回顾单例。死锁问题
- Java多线程之this与Thread.currentThread()的区别——java多线程编程核心技术
- 多线程中this、Thread.currentThread()和this.currentThread()的区别
- 多线程的安全问题。 创建线程的两种方式区别
- 多线程死锁问题的模拟及分析
- Android问题之this与Activity.this的区别
- java 生产者消费者问题-多线程与死锁
- 如何解决多线程程序中的死锁问题
- 多线程(五)——多线程安问题之死锁(Dead Lock )
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
- Linux 多线程程序调用malloc,backtrace引发死锁问题的调试
- JS 中的this指向问题和call、apply、bind的区别
- 银行家算法:解决多线程死锁问题
- Java 多线程 ---- 线程中this与 Thread.currentThread()线程的区别
- 多线程总结2(死锁等问题)
- js中箭头函数和普通函数this的区别