hytoor

 

2023.2.20

死锁

  • 不出现Exception,不出现error,程序一直僵持
  • synchronized最好不要嵌套使用,容易发生死锁,且不容易调试

开发中如何解决线程安全问题

  • 尽量使用局部变量来代替实例变量和静态变量
  • 如果必须使用实例变量,通过创建多个对象让实例变量的内存不共享(对象不共享,就不存在数据安全问题)
  • 如果不能使用局部变量,对象也不能创建多个,就只能使用synchronized关键字,即线程同步机制

Thread

守护线程(后台线程)

  • 一般守护线程是一个死循环,所有用户线程结束,守护线程自动结束(比如gc(垃圾回收器))
  • 守护线程使用场所
    1. 每天00:00的时候系统数据自动备份。
      这个时候需要使用定时器,并将定时器设置为守护线程,每到00:00系统自动备份。

用户线程

定时器

  • 间隔特定的时间,执行特定的程序。
  1. 使用sleep(),睡眠,设置睡眠时间,每到这个时间点醒来,执行任务(最原始的定时器)
  2. java类库中已经写好的定时器:java.util.Timer ,可以直接使用,实际开发中很少用,很多高级框架都支持自己的定时任务
  3. 实际开发中,使用较多的是Spring框架中的SpringTask框架,只需要简单配置,就可以完成定时器的任务。

Object类中的 wait() 和 notify()

  • wait() 和notify() 不是线程的方法,是java对象的方法
Object o = new Object();
	o.wait();
	o.notify();
  • wait()的作用
    让正在o对象上活动的线程进入等待状态,无期限等待直到被唤醒。并且释放O对象的锁
  • notify()的作用
    让正在o对象上等待的线程唤醒。只会通知,不会释放o对象的锁
  • notifyAll()
    让正在o对象上处于等待的所有线程唤醒

Path

posted on 2023-02-20 23:00  hytoor  阅读(21)  评论(0)    收藏  举报

导航