线程学习(二)-死锁和生产者消费者问题

1.死锁问题:

  死锁是由于一个线程锁住一个资源A,等待另一个B;而另一个线程锁住资源B,等待资源A造成的资源竞争引起的问题。

例如:一个死锁的例子:

package Thread;

/**
 * 测试死锁
 *思路:两个线程,每个线程占有不同的资源,等待其他资源
* @author: qlq
* @date :  2018年6月14日上午10:37:24
 */
public class DeadLockTest {

    public static void main(String[] args) {
        MyThread t1 = new MyThread(true);
        MyThread t2 = new MyThread(false);
        t1.start();
        t2.start();
    }
    
}

class MyThread extends Thread{
    private boolean flag;//标记走哪个线路
    static Object A = new Object();//资源A
    static Object B = new Object();//资源B
    public boolean isFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
    protected MyThread(boolean flag) {
        super();
        this.flag = flag;
    }
    @Override
    public void run() {
        if(flag){//占有资源A,等待资源B
            synchronized(A){
                System.out.println("占有资源A,等待资源B");
                synchronized(B){
                    System.out.println("占有资源B");
                }
            }
        }else{//占有资源B,等待资源A
            synchronized(B){
                System.out.println("占有资源B,等待资源A");
                synchronized(A){
                    System.out.println("占有资源A");
                }
            }
        }
    }
}

结果:

占有资源B,等待资源A
占有资源A,等待资源B

解决办法:最好在一个代码快中对一个对象进行同步上锁,避免重复锁资源。。。。。。。。。。。。。。。。。。。。

2.生产者消费者问题:

猜你喜欢

转载自www.cnblogs.com/qlqwjy/p/9182029.html