2个线程同时开启 , 线程T1拿了1号锁进入以后,又发现一个需要2号锁才可以进入的方法,与此同时线程T2在线程T1拿了1号锁的时候遇到一个需要2号锁的方法,T2拿了2号锁之后,又发现需要1个需要1号锁的方法,结果2个线程都拿着他们各自目前需要的锁,争持不下,于是形成死锁,我之前也不太清楚,不过现在搞懂了,也是师兄给出的。
- public class 死锁 {
- public static void main(String[] args) {
- Book b=new Book();
- Thread t1=new Thread(b);
- Thread t2=new Thread(b);
- t1.start();
- b.is=false;
-
- t2.start();
- }
- }
- class Book implements Runnable{
- int bookNo=1000;
- boolean is=true;
- Object obj=new Object();
- public void run(){
- if(is){
- while(true){
-
- //T1进来进来 拿OBJ锁到show方法前,想开show方法但是没this锁
- synchronized(obj){
- show();
- }
- }
- }
- else{
- while(true)
- show();
- }
- }
-
- //t2也进来来走到show进去拿到show方法的this锁但是需要obj锁
- synchronized void show(){
- synchronized(obj){
- if(bookNo>0)
- {
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println(Thread.currentThread().getName()+"---"+bookNo--);
- }
- }
- }
-
- }
复制代码 |