java知识点(1)

1.描述一下java创建对象的过程?

    1.1检测类是否被加载

    虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载进程。

    1.2为新生类分配内存

    类加载检查通过后,接下来虚拟机将为新生对象分配内存,对象所需内存的大小在类加载完成后便可完全确定。

    1.3初始化零值

    内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象投),这一步操作保证对象的实例字段在java代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。

    1.4进行必要的设置

    虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希吗、对象的GC分代年龄等信息。这些信息存放在对象的对象头之中。

    1.5执行init方法

    完成上面工作之后,从虚拟机的角度看,一个新的对象已经产生了,但从java程序的视角来看,对象创建才刚开始,<int>方法还没有执行,所有的字段都还是零。所以一般来说,执行new指令之后会接着执行<init>方法,把对象按照程序员的意愿进行初始化,这样一个真正的对象才算完全产生出来。

2.java创建对象的方式?

使用new关键字 } → 调用了构造函数
使用Class类的newInstance方法 } → 调用了构造函数
使用Constructor类的newInstance方法 } → 调用了构造函数
使用clone方法 } → 没有调用构造函数
使用反序列化 } → 没有调用构造函数

3.说一下java的内存模型?

    java内存模型规范了java虚拟机与计算机内存是如何协同工作的。java虚拟机是一个完整的计算机的一个模型,这个模型包含一个内存模型,又称为java内存模型。

    java内存模型把java虚拟机内部划分为线程堆和栈。

    每一个运行在java虚拟机里的线程都拥有自己的线程栈。这个线程栈包含了线程调用的方法当前执行点相关的信息。一个线程仅能访问自己的线程栈。一个线程创建的本地变量对其他线程不可见,仅自己可见。每个线程拥有每个本地变量的独有版本。

    堆上包含在java程序中创建的所有对象,无论是哪一个对象创建的。这包括原始类型的对象版本。如果一个对象被创建然后赋值给一个局部变量,或者用来作为另一个对象的成员变量,这个对象仍然存放在堆上。

   调用栈和本地本地变量存放在线程栈上,对象存放在堆上。

4.static变量存放在哪里?   

      1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值局部变量的值等。

    2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由os回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

    3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。

    4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放。

    5、程序代码区—存放函数体的二进制代码。 

5.volatile介绍一下?

    volatile是一个类修饰符,被设计用来修饰被不同线程访问和修改的变量。被volatile类型定义的变量,系统每次用到它时都是直接从对应的内存当中提取。而不会利用缓存。在使用volatile修饰成员变量后,所有线程在任何时候所看到变量的值都是相同的。

     一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。  

2)禁止进行指令重排序。

6.线程如何同步?

    6.1. 用什么关键字修饰同步方法 ? 用synchronized关键字修饰同步方法

    6.2. 同步有几种实现方法,都是什么?分别是synchronized,wait与notify

      wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
      sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
      notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
      notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

    6.3.使用特殊域变量(volatile)实现线程同步,不能修饰final变量

        a.volatile关键字为域变量的访问提供了一种免锁机制 
        b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新 
        c.因此每次使用该域就要重新计算,而不是使用寄存器中的值 
        d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量

    6.4.使用重用锁实现线程同步

    6.5.使用局部变量实现线程同步

7.进程和线程的区别?

    (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间; 

    (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源 

    (3)线程是处理器调度的基本单位,但进程不是. 

    (4)二者均可并发执行.

    进程是资源分配的基本单位,线程是调度的基本单位。进程包含线程,线程共用进程的资源。

    

    

发布了36 篇原创文章 · 获赞 19 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_27182767/article/details/79701987