六、同步和死锁

重点:

1、 资源共享时需要进行同步操作

2、 程序中过多的同步会产生死锁

卖火车票,加延迟票数就出问题了
因为加入延迟操作,那么一个线程有可能在还没有对票数进行减操作之前,其他线程就已经将票数减少了,这样一来就会出现票数为负的情况

要解决这样的问题,就必须使用同步操作

同步是指多个操作在同一个时间段内只能一个线程进行,其他线程要等此线程完成之后才可以继续执行

死锁

死锁一般情况下就是表示在互相等待

简单示例

public class MainActivity extends AppCompatActivity {

private String obj1 = "obj1";
private String obj2 = "obj2";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new Thread(new Lock1()).start();
    new Thread(new Lock2()).start();
}

class Lock1 implements Runnable{

    @Override
    public void run() {
        try {
            synchronized (obj1){
                Log.i("MainActivity1","Lock1 lock obj1");
                Thread.sleep(3000);
                //这时想获得obj2锁,但被Lock2占用了
                synchronized (obj2){
                    Log.i("MainActivity1","Lock1 lock obj2");
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

class Lock2 implements Runnable{

    @Override
    public void run() {
        try {
            synchronized (obj2){
                Log.i("MainActivity1","Lock2 lock obj2");
                Thread.sleep(3000);
                synchronized (obj1){
                    Log.i("MainActivity1","Lock2 lock obj1");
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}}

注意:死锁不一定导致崩溃,只是线程一直被阻塞着,没法结束,就一直销毁这app的内存资源
手写死锁的关键:关键是Thread.sleep(3000) ,睡3s好让其他线程获取需要的锁资源