前言
函数
文章目录
- 前言
- 一、注解
- 二、反射
- 1、作用
- 三、多线程
- 1、基本概念
- 2、实现方式
- 1)继承 Thread 类
- 2)实现Runnable接口
- 3、常用 API
- 四、锁
- 1、为什么
- 2、锁
一、注解
- 注解不影响程序逻辑,但会被编译器在不同阶段(编译、执行)执行;
例如,@Override
注解会在编译时执行,用来检验代码是否符合规范,给一个函数加上@Override
,如果函数没有重载,就会报编译错误; - 注解又被称为元数据,用于修饰包、方法、属性、构造器、局部变量等数据信息;
@Override
:提示某个函数重写基类的某个函数;@interface
:定义一个注解- 元注解
二、反射
1、作用
- Java 编译于运行过程:Java 源码 —(编译)–> Java 字节码 —> 加载类(因为 Java 的代码是由一个一个类组成)—> 执行;
- 动态地修改某些代码:对于一个大型 Java 项目,当我们想修改其中的一小段代码时,可以通过反射机制只修改这一段代码的逻辑,然后将需改后的代码加到原项目中,无需像 C++ 一样修改一段代码,需要编译整个项目;
- 项目中某个类需要频繁修改,修改完这个类无需重新打包整个项目,可以在项目中动态加载这个类;
三、多线程
1、基本概念
1)每一个程序都是一个进程;
2)同一时间有多个线程在执行,高效;
2、实现方式
1)继承 Thread 类
-
每个线程都是一个对象;不同线程的对象是不同的;
-
遇到 start() 函数会新开一个线程,执行 run();
-
多个线程执行的顺序是随机的;
2)实现Runnable接口
- 多个线程可以共用一个对象;
3、常用 API
- start()
- Thread.sleep()
- join():一个线程等待另外一个线程结束;worker1.join(); // 等worker1线程执行完才继续往下执行
- interrupt():给线程发送一个异常
四、锁
1、为什么
- 同一个进程的多个线程会共享一段内存空间,会出现读写冲突的问题
统计某个网页页面的某门课的报名人数
- cnt 统计数量
- 网站有多个线程执行
- 每个线程对应 一个人报名成功,cnt = cnt + 1(多线程运行过程中,多个线程在执行这条语句时,并不会某个线程会完整地执行完这个语句再执行下一个线程),多个线程再执行时可能会同时执行这条语句;
- cnt = cnt + 1:对应三个操作,先取 cnt 的值,再将 cnt + 1,再给 cnt 赋值;
- 出现的问题:第一个线程取 cnt 的值,此时 cnt 的值为 0,然后被操作系统挂载;第二个线程开始执行,执行完了 3 个操作,第二个线程执行完了,此时 cnt = 1;第一个线程继续执行,执行 cnt + 1(0 + 1 = 1),此时 cnt = 1;导致两个人买完课之后,cnt 的值仍然为 1,出错
- 出现读写冲突的问题
- 两个线程同时写一个变量值,会有冲突
- 一个线程读,另一个线程写,会有冲突(先读再写读的是旧值,先写再读读的是新值,两个线程的读和写是随机的,最终的情况也不是唯一确定的)
2、锁
- 访问公共资源,在访问之前,先去拿到这个锁将公共资源锁住,同一个锁同一时间只能被一个线程锁定,一个线程拿到这把锁,lock() 其余线程就会被阻塞在这句话上(停止不同),保证此时只能有一个线程访问公共资源。当一个线程处理完成之后,再将这把锁释放掉,unlock()