1. Java数据类型
Java 的数据类型分为两种:基本数据类型 和 引用类型。
1)基本类型:Java有8中基本类型数据。分别是byte、short、char、int、long、float、double、boolean。
整型:byte(最小的计算单元为字节), short(2个byte), int(4个字节), long(8个字节)
字符型:char
浮点型:float(4个字节), double(8个字节)
布尔型:boolean
byte=8bit 即8个比特位,简称8位。
2)引用类型:对象、数组都是引用数据类型。
2、 类的初始化 & 实例化顺序
父类静态代码块(按static声明的先后顺序)--》
子类静态代码块(按static声明的先后顺序)--》
父类实例代码块(按声明的先后顺序)--》
父类构造函数 --》
子类实例代码块(按声明的先后顺序)--》
子类构造函数。(类中“{}”修饰的代码算实例代码在static后面执行)。
3、 如何理解Java中的final、static、final static、static final?
1) final 是一个关键字。它可以修饰类、方法、变量。
修饰类:类不能被继承。
修饰方法:方法不能被重写。
修饰变量: fianl修饰的变量必须初始化值,赋值有两种方式:
a.直接赋值。 b.全部在构造方法中赋初值。
如果修饰的成员变量是基本类型,则表示这个变量的值不能改变。
如果修饰的成员变量是一个引用类型,则是说这个引用的地址的值不能修改,但是这个引用所指向的对象里面的内容还是可以改变的变量。
2) static 的主要作用 是 在于创建独立于具体对象的域变量者方法,即使没有创建对象,也能使用属性和调用方法。
static可以修饰 成员变量、成员方法、内部类、代码块。
被static修饰的成员变量叫做静态变量,也叫做类变量,说明这个变量是属于这个类的,而不是属于是对象。
被static修饰的方法也叫做静态方法,因为对于静态方法来说是不属于任何实例对象的,那么就是说在静态方法内部是不能使用this的。
3) final static与static final没有区别,一般static写在前面。static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问。
4、synchronized
synchronized是Java中的关键字,是一种同步锁。可修饰 代码块、方法,被修饰的对象会被锁住,其它线程在访问的时候,会被阻塞。
synchronized 和Lock区别
区别如下:
来源:
lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现;
异常是否释放锁:
synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生。(所以最好将同步代码块用try catch包起来,finally中写入unlock,避免死锁的发生。)
是否响应中断
lock等待锁过程中可以用interrupt来中断等待,而synchronized只能等待锁的释放,不能响应中断;
是否知道获取锁
Lock可以通过trylock来知道有没有获取锁,而synchronized不能;
Lock可以提高多个线程进行读操作的效率。(可以通过readwritelock实现读写分离)
在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。
synchronized使用Object对象本身的wait 、notify、notifyAll调度机制,而Lock可以使用Condition进行线程之间的调度,
//Condition定义了等待/通知两种类型的方法
Lock lock=new ReentrantLock();
Condition condition=lock.newCondition();
...condition.await();
...condition.signal();
condition.signalAll();
5、悲观锁、乐观锁
指的是心态。乐观锁与悲观锁并不是特指某个锁,而是在并发情况下保证数据完整性的不同策略。悲观锁指的就是我们平常使用的加锁机制,它假设我们总是处于最坏的情况下,如果不加锁数据完整性就会被破坏。而乐观锁指是一种基于冲突检测的方法,检测到冲突时操作就会失败
悲观的认为所有的线程都会导致数据错误,每一个线程都需要排队等待。优点:数据一致性,缺点:效率低
在并发数不是特别高的情况下,使用CAS的乐观锁在性能上要优于使用加锁方式的悲观锁。