2023-12-04

发布时间 2023-12-04 22:28:42作者: 神烦狗~

2023-12-04

线程常用方法

  1. yield 线程的礼让。让出CPU,让其他线程执行,但让的时间不确定,所以不一定礼让成功
  2. join 线程的插队。线程的一旦插入成功,则肯定先执行完插入的线程的所有任务

用户线程和守护线程

  1. 用户线程:也叫工作线程,当线程任务执行完或者收到通知来结束

  2. 守护线程:一般是为工作线程服务的,当所有用户线程结束,守护线程自动结束

    (常见:垃圾回收机制)

  3. 将子线程设置为主线程结束时结束:子线程名.setDaemon(true);

线程的生命周期

线程可以处于的六种状态

  1. NEW:尚未启动的线程处于此状态
  2. RUNNABLE:在java虚拟机中执行的线程处于此状态
  3. BLOCKED:被阻塞等待监视器锁定的线程处于此状态
  4. WAITING:正在等待另一个线程执行特定动作的线程处于此状态
  5. TIMED_WAITING:正在等待另一个线程执行动作达到指定等待时间的线程处于此状态
  6. TERMINATED:已退出的线程处于此状态

线程状态转换图

image

注意事项

  1. RUNNABLE状态可以细化为READY(准备就绪)和RUNNING(运行中)状态
  2. 获取线程当前状态:线程名.getState()

Synchronized

线程同步机制

  1. 在多线程中,一些敏感的数据不允许被多个线程同时访问,此时使用同步访问技术。保证数据在任何同一时刻,最多有一个线程访问,以保证数据的完整性
  2. 线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作

同步具体方法

image

互斥锁

  1. 在java语言中,引入了对象互斥锁的概念,来保证共享数据时操作完整性
  2. 每个对象都对应一个可以称为”互斥锁“的标记,这个标记用来保证在任意时刻,只能有一个线程访问该对象
  3. 关键字Synchronized用来与对象的互斥锁联系,当某个对象用Synchronized来修饰时,表明该对象在任意时刻,只能有一个线程访问。
  4. 同步的局限性:导致程序的执行效率降低
  5. 同步方法(非静态的)的锁可以是this的,也可以是其他对象的(默认为this)
  6. 同步方法(静态的)的锁为当前类本身(默认为当前类.class)

实现步骤

  1. 分析上锁的代码
  2. 选择同步代码块或同步方法
  3. 要求多个线程的锁的对象为同一个