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