Java 基础(一)

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区别

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的乐观锁在性能上要优于使用加锁方式的悲观锁。

你可能感兴趣的:(Java 基础(一))