美文网首页
六、同步和死锁

六、同步和死锁

作者: 你的益达233 | 来源:发表于2020-01-02 21:32 被阅读0次

    重点:

    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好让其他线程获取需要的锁资源

    相关文章

      网友评论

          本文标题:六、同步和死锁

          本文链接:https://www.haomeiwen.com/subject/maqaoctx.html