线程的同步和死锁3

本篇是为了线程的死锁情况。
其实我们可以发现,所谓的同步就是一个线程对象等待另外一个线程对象执行完毕后的操作形式。

线程通过过多就可能造成死锁。下面编写一个程序,目的是为了了解死锁,没有任何意义。
下面是A。B分别要用笔与本交换,A,B都要收到笔/本才会交换本/笔

package TestDemo;



class A{
    public synchronized void say(B b){
        System.out.println("book needs");
    }
    public synchronized void get(){
        System.out.println("book has been got");
    }
}

class B{
    public synchronized void say(A a){
        System.out.println("pen needs");
        a.get();
    }
    public synchronized void get(){
        System.out.println("pen has been got");
    }
}

public class TestDemo implements Runnable{
    public static A a=new A();
    public static B b=new B();
    public static void main(String[] args)throws Exception{
        new TestDemo();


    }

    public TestDemo(){
        new Thread(this).start();
        b.say(a);
    }

    @Override
    public void run() {
        a.say(b);
    }
    
}

发现程序会一直执行,造成了死锁,但是如果又一方解锁,就会解锁。

以上的代码只是为了说明死锁,并无任何实际意义。
死锁是程序开发之中,由于某种逻辑上的错误所造成的问题,并且不是简单的就会出现的。

面试题:请解释多个线程访问同一资源时需要考虑到哪些情况,哪些问题。

1.多个线程访问同一资源时一定要处理好同步,可以使用同步代码块或者同步方法

1.1同步代码块:synchronized(锁定对象){}
1.2同步方法: public synchronized 返回值 方法名称(){}

2.但是过多的同步,可能会造成死锁

猜你喜欢

转载自blog.csdn.net/weixin_34273481/article/details/87040360
今日推荐