4.Java加强-多线程的实现-Thread类-线程安全

  • 多线程的实现
  • Thread类中常用的方法
  • 分析怎样出现线程安全问题
  • 处理线程安全的三种方式
  • 卖票的案例
  • 定时器任务
          • run()里面的代码还没有执行完,但是没有时间片了,进入了阻塞状态(sleep())
          • run()里面的代码执行完,线程进入死亡
        • 新建 new
        • 就绪 runnable
        • 运行 running,执行run()方法
      • 5.线程的生命周期
      • 线程的状态认识
      • 创建一个同步锁
        privite final static ReentrantLock Look = new ReentrantLock();
        privite final static ReentrantLock Look = new ReentrantLock(true/fales);
        
        使用方式:
        public void rum(){
            //上锁
            Look.lock();
            try{
                // 执行的代码
            }finally{
                //解锁
                Look.unLook
            }
        }
        4.锁的概念
      • 悲观锁:同步代码块 同步方法(容易造成死锁)
      • 乐观锁:同步锁
      • public static synchronized void getWoter(){
            
        }
        同步方法的锁是自动加的,如果同步方法是类方法,那么锁就是当前类的字节码对象
        如果同步方法的锁是自动加的,如果同步方法是实例方法,那么锁就是当前对象的字节码对象(this.getClass())
        
        
        3、同步锁:ReentrantLock
      • ReentrantLock():没有公平机制
      • ReentrantLock(boolean fair):设置公平机制
      • Lock():上锁
      • unLook:解锁
      • 2、同步方法
      • 同步方法 synchronized 来修饰方法
      • 
        synchronized(锁:一个对象(所有线程对象共享)){
            会发生线程安全代码
        }
        
        线程进入这个代码块就会自动上锁,其他线程就无法进入
        等待在里面的线程执行完后,会自动释放锁 
      • 3.【三种】线程安全的处理方式
        1、同步代码块
      • 同步代码块,将会发生线程安全问题的代码,使用同步代码块锁起来
      • 这里创建了一个static的公共锁🔒
      • 如果是使用的继承Thread实现多线程,同步代码块中可以使用当前类的字节码对象this.getClass()
      • 也可以使用类名.class
      • 2.线程安全的发生
      • 线程是靠cpu分配时间片,执行的过程时间片用完后,又抢不到时间片

      • 4、线程安全

        1.线程安全是什么
      • 当一个线程正在执行代码(假设有三个步骤1,2,3),还没有全部执行完毕,就由其他线程在执行了,就是线程安全问题
      • start():开启线程
      • sleep(long millis):让线程进入休眠(阻塞),传入的是毫秒数
      • currentThreadd():获取当前正在执行的线程(当前线程)
        • 什么是守护线程?(后台线程):GC
      • isDaemon():判断线程是否为守护线程
      • setDaemon(boolean):设置一个线程为守护线程
      • getPriority( ):获取线程的优先级(默认为 5 )
      • setPriority(int a):设置线程的优先级

      • 3. 常用方法:
      • getName():获取线程的名字
      • setName(String name):设置线程的名字

      • 2. 构造方法:
      • Thread():创建一个系统分配线程名字的线程。Thread-0
      • Thread(String name):创建一个指定线程名称的线程
      • Thread(Runnable target):使用制定run方法的对象来创建线进程,线程名字是默认的
      • Thread(Runnable target,String name):指定run方法,指定线程名

      • 1. Thread:的常量(名字全部大写的是常量)
      • MAX_PRIORITY:最大优先级 10
      • MIN_PRIORITY:最小优先级 1
      • NORM_PRIORITY:默认优先级 5
      • 优先级越高,分配时间片的几率越大

      • 3、Thread类(多线程类)

      • static修饰的是类方法调用方法是 类名.xxx
      • 实例方法是没有static修饰的,调用方法是,new一个对象,对象名.xx

      • 2、实现线程的两种方式

      • 1、继承Thread:线程启动后(放入内存)获取时间片后要执行的代码,是放在run()方法里面的,重写run()方法(继承方式有限制,只能单继承)
      • 2、实现Runnable接口:要重写方法
        • 提高运行效率
        • 可以使用多核优势;
      • 线程的执行:由cpu为线程分匹配时间片,拿到时间片就执行,时间片用完后就停止,交替执行
      • 注:线程的执行不能人为的控制
      • 程序设计多线程的意义:

      • 3. finally相关的面试题
        try{
            
        }catch(){
            
        }finally{
            
        }
        只有在执行finally之前结束了java虚拟机的情况才不会执行finally的代码否则都会执行

        二、多线程

        1、线程的概念

      • 线程是一小段可执行的代码,进程启动后线程就放入内存线程也是进程最小的单位
        • 一般finally是用来关闭程序释放锁
      • int[] arr = {1, 2};
        System.out.println(arr[2]); // 下标越界 ArrayIndexOutOfBoundsException
        
        String s = null; // null在内存没有引用
        System.out.println(s.length()); // 空指针 NullPointerException
        System.out.println(10 / 0); // 除数为零 ArithmeticException
        
        Object obj = new Object();
        String s = (String)obj; // 类型转换异常 ClassCastException
        
        Integer in1 =  new Integer("10a"); // 数字格式异常 NumberFormatException
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.parse("2023-10-10 10:10:10");

        2. 异常的处理
      • 抛出异常:throws throw
      • 捕获处理:try{}catch(){}finally{}
            • 数组下标越界
            • 空指针异常
            • 非法参数异常
            • 类型转换异常
            • 算数异常
          • 编译时异常
          • 运行时异常
        • Error:错误
        • Exception:异常

      • 3.异常

        1. 体系结构:
      • Thrwable

      • 2、BigDecimal

      • 金融相关的,小数位数的精度不受限制,必须是纯数字
      • 一、回顾

        1、Biginteger

      • 精度超过long时就需要用Biginteger且必须是纯数字

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值