java的线程以及线程同步机制

148 阅读4分钟

线程

  • 线程常用方法

    1. setName() 设置线程参数,使之和参数name相同

    2. getName() 获取该线程的名称

    3. start() 使用该线程开始执行;jvm底层调用该线程的start0()方法

      start底层会创建新的线程,调用run,run就是一简单的方法调用,不会启动新线程

    4. run() 调用线程的run方法

    5. setPriority() 更改线程的优先级

    6. getPriority() 获取线程的优先级

    7. sleep() 休眠 暂停执行

      线程的静态方法,让当前线程休眠

    8. interrupt() 中断线程

      没有真正的结束线程,一般用于中断正在休眠的线程

    9. yield:线程的礼让,让出cpu,让其他线程先执行,但礼让的时间不确定,所以不一定礼让成功 把运行变成就绪

    10. join:线程的插队,插队的线程一旦插队成功,则肯定先执行完插入的线程所有的任务

  • 用户线程和守护线程

    1. 用户线程:也叫工作线程,当线程的任务执行完或者通知方式结束后
    2. 守护线程:一般为工作线程服务的,当所有的用户线程结束,守护线程自动结束
    3. 常见的守护线程:垃圾回收机制
  • 线程的生命周期

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

    1. 在多线程编程,一些敏感的数据不允许被多个线程同时访问,此时就使用同步访问的技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性

    2. 同步的具体方法

      • 同步代码块
         synchronized(对象){  //得到对象的锁,才可以操作同步代码
              //需要被同步的代码
         } 
      
      • synchronized可以放在方法声明中,表示整个方法-为同步方法
         public synchronized void m(){  
              //需要被同步的代码
         } 
      
      • 如何理解: 需要同步的代码,一定要先执行完,其他线程才可以执行
  • 互斥锁

    1. Java语言中,引入对象互斥锁的概念,来保证数据操作的完整性。

    2. 每个对象都对应于一个可以称为"互斥锁"的标记,这个标记用来保证任一时刻,只能有一个线程访问该对象

    3. 关键字synchronized来与对象的互斥联系,当某一个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问

    4. 同步的局限性:导致程序的执行效率要降低

    5. 同步方法(非静态的)锁可以是this,也可以是其他对象(要求是同一个对象)

    6. 同步方法(静态的)的锁为当前类本身

    7. 注意事项:

      1. 同步方法如果没有使用static修饰:默认锁的对象为this

      2. 如果方法使用static修饰,默认锁对象:当前类的class

      3. 实现落地步骤

        • 需要先分析上锁的代码
        • 选择同步代码块或者同步方法
        • 要求多个线程的锁对象为同一个即可
  • 释放锁

    1. 当线程的同步方法、同步代码块执行完毕,所有资源都会进行释放
    2. 当线程在同步代码块、同步方法遇到break、return。
    3. 当线程在同步代码块、同步方法出现了没有处理的Error或者Exception,导致结束
    4. 当线程在同步代码块、同步方法执行了线程对象的wait()方法,当前线程暂停,并释放锁
  • 不会释放锁

    1. 线程执行同步代码块或者同步方法时,程序调用了Thread.sleep(),Thread.yield()方法暂时暂停该线程的执行,不会释放锁
    2. 线程执行同步代码块,其他的线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁