死锁
- 不出现Exception,不出现error,程序一直僵持
- synchronized最好不要嵌套使用,容易发生死锁,且不容易调试
开发中如何解决线程安全问题
- 尽量使用局部变量来代替实例变量和静态变量
- 如果必须使用实例变量,通过创建多个对象让实例变量的内存不共享(对象不共享,就不存在数据安全问题)
- 如果不能使用局部变量,对象也不能创建多个,就只能使用synchronized关键字,即线程同步机制
Thread
守护线程(后台线程)
- 一般守护线程是一个死循环,所有用户线程结束,守护线程自动结束(比如gc(垃圾回收器))
- 守护线程使用场所
- 每天00:00的时候系统数据自动备份。
这个时候需要使用定时器,并将定时器设置为守护线程,每到00:00系统自动备份。
- 每天00:00的时候系统数据自动备份。
用户线程
定时器
- 间隔特定的时间,执行特定的程序。
- 使用sleep(),睡眠,设置睡眠时间,每到这个时间点醒来,执行任务(最原始的定时器)
- java类库中已经写好的定时器:java.util.Timer ,可以直接使用,实际开发中很少用,很多高级框架都支持自己的定时任务
- 实际开发中,使用较多的是Spring框架中的SpringTask框架,只需要简单配置,就可以完成定时器的任务。
Object类中的 wait() 和 notify()
- wait() 和notify() 不是线程的方法,是java对象的方法
Object o = new Object();
o.wait();
o.notify();
- wait()的作用
让正在o对象上活动的线程进入等待状态,无期限等待直到被唤醒。并且释放O对象的锁 - notify()的作用
让正在o对象上等待的线程唤醒。只会通知,不会释放o对象的锁 - notifyAll()
让正在o对象上处于等待的所有线程唤醒