共同点:
不同点:
底层实现不一样,synchronized 是同步阻塞,使用的是悲观并发策略,lock 是同步非阻寒,采用的是乐观并发策略 。
Lock 是一个接口, 而 synchronized 是Java中的关键字,synchronized 是内置的语言实现。
synchonized 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过 unLock() 去释放锁,则很可能造成死锁现象,因此使用 Lock 时需要在 finally 块中释放锁。
Lock 可以让等待锁的线程响应中断,而 synchronized 却不行,使用 synchronized 时,等待的线程会直等待下去, 不能够响应中断。
通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。
Lock可以提高多个线程进行读操作的效率,即就是实现读写锁等。
在Java中的反射机制是指 在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,它的任意一个方法; 这种动态获取信息以及动态调用对象的功能成为Java语言的反射机制。
在Java程序中许多对象在运行是都会出现两种类型:编译时类型 和 运行时类型, 编译时的类型由声明对象时使用的类型来决定,运行时的类型由实际赋值给对象的类型决定。如:
Person p = new Student();
其中 编译时类型为Person,运行时类型为Student。
程序在运行时还可能接收到外部传入的对象,该对象的编译时类型为Object,但是程序有需要调用该对象的运行时类型的方法。为了解决这些问题,程序需要在运行时发现对象和类的真实信息。然而,编译时根本无法预知该对象和类属于哪些类,程序只能依靠运行时信息来发现该对象和类的真实信息,此时就必须使用到反射了。
反射 API 用来生成 JVM 中的类、接口或对象的信息。
Person p = new Person();
Class clazz = p.getClass();
Class clazz=Person.class;
Class clazz = Class forName("类的全路径");
当我们获得了想要操作的类的 Class对象 后,可以通过Class类中的方法获取并查看该类中的方法和属性。
使用 Class 对象的 newInstance() 方法来创建该 Class 对象对应类的实例,但是这种方法要求该 Class对象 对应的类有默认的空构造器。
Annotation (注解)是Java提供的一种对元程序中元素关联信息和元数据(metadata)的途径和方法。Annatation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的 Annotation对象 ,然后通过该 Annotation对象 来获取注解中的元数据信息。
使用关键字 @interface
元注解的作用是负责 注解其他注解。Java5.0 定义了4个标准的 meta-annotation类型,它们被用来提供对其它 annotation类型 作说明。
@Target 说明了Annotation所修饰的对象范围: Annotation可被用于 packages、types (类、接口、 枚举、Annotation类型) 、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量 (如循环变量、catch 参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
@Retention 定义了该Annotation被保留的时间长短:表示需要在什么级别保存注解信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效),取值(RetentionPoicy) 由:
① SOURCE:在源文件中有效(即源文件保留)
② CLASS:在class文件中有效(即class保留)
③ RUNTIME:在运行时有效(即运行时保留)
@ Documented 用于描述其它类型的 annotation 应该被作为被标注的程序成员的公共API,因此可以被例如 javadoc 此类的工具文档化。
@Inherited 元注解是一个标记注解,@Inherited 阐述了某个被标注的类型是被继承的。如果一个使用 了@Inherited修饰的 annotation类型 被用于一个class,则这个annotation将被用于该class 的子类。
泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。比如我们要写一个排序方法, 能够对整型数组、 字符串数组甚至其他任何类型的数组进行排序,我们就可以使用Java泛型。
你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
extends T> 表示该通配符所代表的类型是 T类型的子类 。
super T> 表示该通配符所代表的类型是 T类型的父类 。
泛型类的声明和非泛型类的声明类似, 除了在类名后面添加了类型参数声明都分。和泛型方法一样, 泛型类的类型参数声明部分也包含一个或多个党型参数, 参数间用逗号隔开,一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。 因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。
?
类型通配符一般是使用 ?
代替具体的类型参数。例如 list> 在逻辑上是 List
等所有List的父类。
Java中的泛型基本上都是在编译器这个层次来实现的。在生成的 Java字节代码 中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为 类型擦除 。如在代码中定义的List
和 List
等类型,在编译之后都会变成List。JVM 看到的只是 List ,而由泛型附加的类型信息对 JVM 来说是不可见的。类型擦除的基本过程也比较简单,首先是找到用来替换类型参数的具体类。这个具体类一般是Object。如果指定了类型参数的上界的话,则使用这个上界。把代码中的类型参数都替换成具体的类。