十一、注解
11.1 基本概念
所有注解都隐式扩展自java.lang.annotation.Annotation接口,而且不需要为每个注解提供他的实现类。
注解可以为类、方法、变量等等注释,注解要紧跟被注释的对象,不加分号。
注解的定义方式
public @interface name{ type element(); type element() default value;//变量名要加括号,可以有默认值 type value();//当注解中有且只有一个变量,且名字为value。或者有多个变量但是都有默认值,这时候可以省略value直接给注解赋值。 }
11.2 元注解
元注解是jdk默认自带的注解,用于指定自定义注解的属性
@Target: 用于指定注解的作用于,如METHOD,FIELD,CLASS,值为数组类型//elementType.METHOD... @Rentension: 用于指定一条注解的保留时间://RetentionPolicy.CLASS... RUNTIME,保存在class文件中,并且可以被反射访问 CLASS,保存在class文件中,不能被反射访问 SOURCE,只保存在源文件中 @Inherited:只能用于类的注解,子类拥有和父类一样的注解。
10.3 通过反射获取注解
注解的Rentension值为RUNTIME的才能通过反射获取
Method toString = User.class.getMethod("toString"); //拿到方法 boolean b = toString.isAnnotationPresent(MyAnnotation.class); //判断方法上面是否有注解 MyAnnotation value = toString.getAnnotation(MyAnnotation.class); //如果有注解就拿到这个注解 System.out.println(value.name()); //拿到注解的值
十三、多线程下的队列
- JUC包下的队列
阻塞式 阻塞式 非阻塞式 LinkedBlockingQueue ArrayBlockingQueue ConcurrentLinkedQueue 使用独占锁实现的无界链表队列 使用有界数组实现的阻塞队列(初始容量为多大就只能添加多少元素) CAS算法实现 ==boolean offer==:队列末尾添加,如果传入为null抛NPE异常,如果队列满了,返回false,反之返回true。该方法是==不阻塞==的 ==boolean offer==:队列末尾添加,如果传入为null抛NPE异常,如果队列满了,返回false,反之返回true。该方法是==不阻塞==的 ==boolean add\offer==:队列末尾添加,如果传入为null则抛NPE异常。如果成功返回true ==void put==:队列末尾添加,如果传入为null抛出NPE异常,如果队列满了,则阻塞当前线程直到队列空闲添加成功。如果在==阻塞==时被中断则抛出InterruptedException返回 ==void put==:队列末尾添加,如果传入为null抛出NPE异常,如果队列满了,则阻塞当前线程直到队列空闲添加成功。如果在==阻塞==时被中断则抛出InterruptedException返回 ==E poll==:从队首移除元素并返回,如果队列为空返回null,==非阻塞== ==E poll==:从队首移除元素并返回,如果队列为空返回null,==非阻塞== ==E poll==:从队首获取并移除,如果为空返回null。 ==E peek==:返回队首元素不删除,如果队列为空返回null,该方法==不阻塞== ==E peek==:返回队首元素不删除,如果队列为空返回null,该方法==不阻塞== ==E peek==:从队首获取不移除,如果为空返回null ==E take==:从队首移除元素并返回,如果队列为空则==阻塞==当前线程直到队列不为空返回元素 ==E take==:从队首移除元素并返回,如果队列为空则==阻塞==当前线程直到队列不为空返回元素 ==boolean remove==:删除队列指定元素obj,有则删除返回true,反之false。删除第一个元素。==不阻塞== ==boolean remove==:删除队列指定元素obj,有则删除返回true,反之false。删除第一个元素。==不阻塞== ==boolean remove==:如果队列存在该元素则删除,如果存在多个则删除第一个,并返回true,否则返回false ==int size==:返回队列元素个数,这个size比ConcurrentLinkedQueue的size准确,因为加锁保证了遍历时的原子性,而cas不能保证遍历的原子性 ==int size==:返回队列元素个数,这个size比ConcurrentLinkedQueue的size准确,因为加锁保证了遍历时的原子性,而cas不能保证遍历的原子性 ==contains\size==:弱一致性,有可能在遍历的时候其它线程已经操作了队列。
阻塞式 | 阻塞式 |
---|---|
PriorityBlockingQueue | DelayQueue |
==带优先级的无界阻塞队列,内部用数组存储==,但是这个不同于ArrayBlockingQueue,它是==可以扩容==的。每次出队都==返回优先级最高或者最低的元素==,内部使用平衡二叉树堆实现,遍历元素不保证有序。默认使用存储对象的==compareTo==比较规则,可以构造方法传入一个==Comparotor==自定义规则。优先级越高的元素在越顶部。优先级是自定义的,其实就是Comparator或者Comparable比较规则。 | ==无界阻塞延迟队列,每个元素都有一个过期时间==,当从队列获取元素时,只有过期元素才会出队列。==队首元素是最快要过期的元素== |
==boolean offer==:无界队列,可以一直添加 | ==boolean offer==:插入元素到队尾,如果==元素为null抛出NPE异常==,否则因为是无界队列,可以一直插入元素 |
==E poll==:获取根节点元素,如果为空,返回null | ==E poll==:获取并移除队首过期元素,如果没有就返回null |
==E take==:获取根节点元素,如果队列为空则==阻塞== | ==E take==:获取并移除队列中即将过期的元素(队首),如果没有,就==阻塞==等待 |
==void put==:内部==调用offer==,因为无界,所以==不需要阻塞== | |
==int size==:返回元素个数,加了锁,所以精确 | ==int size==:计算队列元素个数,包含过期和未过期 |
十四、多线程下的集合
- 多线程下的线程安全的集合,这里介绍的不是通过Collections.synchronizedList这种方式获得的集合,这种集合效率低,因为使用了synchronized同步。多线程下的集合使用的是Lock锁。
多线程下的集合使用方法和单线程的集合一样。
+